Hibernate 的关联关系的配置:
一对一外键约束:
举例子是一个丈夫和妻子:【一个丈夫只能有一位妻子】
表结构:
CREATE TABLE `tbl_hus` ( `uuid` bigint(10) NOT NULL auto_increment, `name` varchar(30) NOT NULL, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 CREATE TABLE `tbl_wife` ( `uuid` bigint(10) NOT NULL auto_increment, `name` varchar(30) NOT NULL, `husUuid` bigint(10) NOT NULL, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
妻子表中有个外键,是丈夫的 uuid,所以称丈夫类为主方,妻子类为从放。
在 Model 中:
下面是我实现的 Hibernate 的 Dao 层:
Spring 为整合 Hibernate3 提供了两个工具类,分别是 HibernateTemplate 和 HibernateDaoSupport ,但是 Spring 不推荐使用这两个实现 Dao 层,因为操作复杂 CRUD 不是很灵活,而是推荐使用通过注入 SessionFactory 的方式,用过 getCurrentSession() 获取当前线程的 Session 对象,然后进行持久化。
下面是我在自己练手项目中实现的 dao 模块的一部分:
1 . Dao层的顶层接口类:
package dao; import java.io.Serializable; import java.util.List; /** * Dao层的顶层接口 * * @author 码上猿梦 * http://www.cnblogs.com/daimajun/ * @param <T> */ public interface BaseDao<T> { /** * 根据类和主键值获取一个实体对象 * @return */ T get(Class<T> entityClazz, Serializable id); /** * 根据实体对象保存数据 * @param entity * @return */ Serializable save(T entity); /** * 根据实体对象更新数据 * @param eneity */ void update(T eneity); /** * 根据实体对象删除数据 * @param entity */ void delete(T entity); /** * 根据实体类型和主键id删除数据 * @param entityClazz * @param id */ void deleteById(Class<T> entityClazz,Serializable id); /** * 根据实体类型获取其所有对象,并封装为List集合 * @param entityClazz * @return */ List<T> findAll(Class<T> entityClazz); /** * 根据实体类获取对象总数 * @param entityClazz * @return */ Long findCount(Class<T> entityClazz); }
2 . Dao层的空实现类:【用于注入 SessionFactory】
package dao.impl; import java.io.Serializable; import java.util.List; import org.hibernate.SessionFactory; import dao.BaseDao; /** * BaseDao的空实现 * 用于注入SessionFactory * * @author 码上猿梦 * http://www.cnblogs.com/daimajun/ * @param <T> */ public class BaseDaoEmptyImpl<T> implements BaseDao<T> { /** * 会话工厂 */ private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } /** * 注入SessionFactory * @param sessionFactory */ public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @Override public T get(Class<T> entityClazz, Serializable id) { return null; } @Override public Serializable save(T entity) { return null; } @Override public void update(T eneity) { } @Override public void delete(T entity) { } @Override public void deleteById(Class<T> entityClazz, Serializable id) { } @Override public List<T> findAll(Class<T> entityClazz) { return null; } @Override public Long findCount(Class<T> entityClazz) { return null; } }
3 . Dao层实现类:
package dao.impl; import java.io.Serializable; import java.util.List; import org.hibernate.Query; /** * Dao层的实现类 * * @author 码上猿梦 * http://www.cnblogs.com/daimajun/ * @param <T> */ public class BaseDaoImpl<T> extends BaseDaoEmptyImpl<T> { @Override public T get(Class<T> entityClazz, Serializable id) { return this.getSessionFactory().getCurrentSession().get(entityClazz, id); } @Override public Serializable save(T entity) { return getSessionFactory().getCurrentSession().save(entity); } @Override public void update(T eneity) { getSessionFactory().getCurrentSession().saveOrUpdate(eneity); } @Override public void delete(T entity) { getSessionFactory().getCurrentSession().delete(entity); } @Override public void deleteById(Class<T> entityClazz, Serializable id) { this.getSessionFactory().getCurrentSession() .createQuery("delete" + entityClazz.getSimpleName() + "en where en.id = ?0") .setParameter(0, id) .executeUpdate(); } @Override public List<T> findAll(Class<T> entityClazz) { return find("select * en from" + entityClazz.getSimpleName() + "en"); } /** * */ @Override public Long findCount(Class<T> entityClazz) { List<T> list = find("select" + entityClazz.getFields()[0].toString() + "from" + entityClazz.getSimpleName() + "en"); if (null!=list && list.size()==1 ) { return (Long)list.get(0); } return 0L; } /** * 根据Hql语句查询 * @param Hql * @return */ @SuppressWarnings("unchecked") protected List<T> find(String Hql) { List<T> list = getSessionFactory().getCurrentSession().createQuery(Hql).list(); return list; } /** * 根据带参数的Hql语句查询数据 * @param Hql * @param params * @return */ @SuppressWarnings("unchecked") protected List<T> find(String Hql,Object...params) { Query query = getSessionFactory().getCurrentSession().createQuery(Hql); for (int i = 0; i < params.length; i++) { query.setParameter(i + "", params[i]); } return query.list(); } /** * 使用Hql语句,执行分页查询 * @param hql * @param pageNo 当前页码 * @param pageSize 每页大小 * @return */ @SuppressWarnings("unchecked") protected List<T> findByPage(String hql, int pageNo, int pageSize) { Query query = getSessionFactory().getCurrentSession().createQuery(hql); query.setFirstResult((pageNo-1) * pageSize).setMaxResults(pageSize); return query.list(); } /** * 使用带参的Hql语句,进行分页查询 * @param Hql * @param pageNo 当前页码 * @param pageSize 每页大小 * @param params * @return */ @SuppressWarnings("unchecked") protected List<T> findByPage(String Hql, int pageNo, int pageSize, Object...params) { Query query = getSessionFactory().getCurrentSession().createQuery(Hql); for (int i = 0; i < params.length; i++) { query.setParameter(i, params[i]); } query.setFirstResult(pageNo).setMaxResults(pageSize); return query.list(); } }
代码思路来源于【轻量级JavaEE 企业级应用实战第4版 Struts2 + Spring + Hibernate 整合开发】。