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 整合开发】。

最新文章

  1. 1.1、MyEclipse自定义注释
  2. 【Java EE 学习 24 上】【注解详解】
  3. xml转义字符
  4. NodeJS系列~第三个小例子,NodeJs与Redis实现高并发的队列存储
  5. IT人的自我导向型学习:学习的1个理念和2个心态
  6. Android开发百度地图(一)--显示基本地图
  7. BZOJ 1207: [HNOI2004]打鼹鼠( dp )
  8. Java 向Hbase表插入数据报(org.apache.hadoop.hbase.client.HTablePool$PooledHTable cannot be cast to org.apac
  9. JS插件库
  10. 已有 JFFs2文件系统的修改
  11. CodeChef June Challenge 2017
  12. A + B Problem II(大数加法)
  13. Day9 操作系统介绍
  14. 安装mysql以及遇到的问题解决
  15. puppeteer(一)环境搭建——新Web自动化工具(同selenium)
  16. 如何在linux系统下配置无线网卡?【转】
  17. 详解C#7.0新特性
  18. 【新题】ocp 062 2019年考试新题-3
  19. 干货 | 自适应大邻域搜索(Adaptive Large Neighborhood Search)入门到精通超详细解析-概念篇
  20. Python 操作 SQL 数据库 (ORCAL)

热门文章

  1. express-session deprecated undefined resave option; provide resave option app.js
  2. 20155210潘滢昊 2016-2017-2《Java程序设计》第一周学习总结
  3. 【待解决】关于CLASSPATH的显示问题
  4. 20145226夏艺华 网络对抗技术EXP4 恶意代码分析
  5. 【转】bash: ssh: command not found解决方法(linux)
  6. Django——多网页网站及网页互联
  7. 【SpringCloud】第十二篇: 断路器监控(Hystrix Turbine)
  8. Linux环境下Java应用性能分析定位-CPU使用篇
  9. ES6的新特性(19)——Module 的语法
  10. CSS3在线实战