假设我们要建表X,那么我将需要执行以下步骤:
注意:在我们的项目中,我们将DAO文件和X.hbm.xml归入DAO包,将表的实例化放入model包,将Service Implement放入ServiceImpl包,将Service Interface放入Service包。另外,dao-background.xml保存dao-xml信息,service-background.xml保存service-xml信息。
1. 连接数据库。
2. 生成表x的DAO,实例化类和hbm.xml。
3. 将实例化类和hbm.xml移到DAO包
4. 修改hbm.xml,注释掉未添加的键值关联
5. 建立XServiceImpl文件,编写Impl代码
6. 提取Service Interface到Service包,类型规范为XService
7. 修改dao-background.xml和service-background.xml,即添加DAO和service信息
8. 新建JUNITtest,测试。
如果需要在项目中使用HQL(以分页为例),可以执行如下步骤。
说明:这里只包含基本的架构方式(参考《轻量级Jave EE》),可能有误。
1. 在DAO或者Service里添加HQL语句(本项目放入DAO包):
2. 注意提交事务和关闭session(这是后期开发遇到的问题)。
//added manually by Van_ruin
public static List<ProductInfo> findAllRecordByPage(int start,int limit){
List<ProductInfo> productTypeInfos;
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
productTypeInfos = session.createQuery("from ProductInfo")
.setFirstResult(start)
.setMaxResults(limit)
.list();
tx.commit();
HibernateUtil.closeSession();
return productTypeInfos;
}
这里会发现Session类和HibernateUtil类都未导入,Session类来自于org.hibernate.Session;HibernateUtil则为自己新建(代码来自于《轻量级Jave EE》)。可以将这个类放到同目录下。
package com.background.dao;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil
{
public static final SessionFactory sessionFactory;
static
{
try
{
//采用默认的hibernate.cfg.xml来启动一个Configuration的实例
Configuration configuration = new Configuration()
.configure();
//由Configuration的实例来创建一个SessionFactory实例
sessionFactory = configuration.buildSessionFactory();
}
catch (Throwable ex)
{
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
//ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步
public static final ThreadLocal<Session> session
= new ThreadLocal<Session>();
public static Session currentSession()
throws HibernateException
{
Session s = session.get();
//如果该线程还没有Session,则创建一个新的Session
if (s == null)
{
s = sessionFactory.openSession();
//将获得的Session变量存储在ThreadLocal变量session里
session.set(s);
}
return s;
}
public static void closeSession()
throws HibernateException
{
Session s = session.get();
if (s != null)
s.close();
session.set(null);
}
}
2. 添加ServiceImpl中的函数(如果HQL已经放入Impl中,则不需要)
3. 添加ServiceInterface函数。
4. 测试。
简单实用的HQL语句:
1. 排序: from *(实体名) order by *(属性值) [desc]
2. 排序对象为外键的时候: from *(实体名) order by *(实体属性值).*(外键属性)
action开发流程:
1. 根据用例添加action方法。
2. 如果service内没有现成方法,添加service方法。
3. 如果需要用到HQL,在DAO中添加方法。
4. 添加strut信息。
5. 添加action信息。