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

Hibernate 应知应会的更多相关文章

  1. 测试TwemProxy的应知应会

    一.背景 最近中间件开发组对twemproxy的发现注册机制做了改造,之前没有接触过twemproxy,借这次测试的机会,初步学习了一下twemproxy相关的知识:下面用"测试语言&quo ...

  2. SpringMVC 应知应会

    springMVC 是表现层技术,可以用来代替 struts2,下面是简略图:主要是处理器和视图,只有这两个部分需要编写代码. springMVC 三大组件:处理器映射器,处理器适配器,视图解析器. ...

  3. Markdown的应知应会

    Markdown介绍 什么是Markdown Markdown是一种纯文本.轻量级的标记语言,常用作文本编辑器使用.和记事本.notepad++相比,Markdown可以进行排版:和Word相比,Ma ...

  4. Linux用户应知应会的7个‘ls’命令的独特技巧

    在前面我们系列报道的两篇文章中,我们已经涵盖了关于‘ls’命令的绝大多数内容.本文时‘ls命令’系列的最后一部分.如果你还没有读过该系列的其它两篇文章,你可以访问下面的链接. Linux中的15个基本 ...

  5. 【应知应会】15个常用的JavaScript字符串操作方法

    1 初始化 //常用初始化方法 var stringVal = "hello iFat3"; //构造函数创建方法 var stringObj = new String(" ...

  6. Struts2 应知应会

    struts.xml 文件的 action 的配置: Struts2 中结果类型的配置来自于下面: 其中: dispatcher:转发技术,转发到一个 jsp 视图 redirect:重定向到一个 j ...

  7. .NET架构开发应知应会

    .NET程序是基于.NET framework..NET Core.Mono.UWP[.NET实现]开发和运行的 ,定义以上[.NET实现]的标准规范称为.NET Standard L1:.NET S ...

  8. Java 多线程应知应会

    请简单说说 synchronized 关键字的底层原理 java 说到多线程绝对绕不开 synchronized,很多 java 工程师对 synchronized 是又爱又恨.为什么呢?主要原因包括 ...

  9. 关于HDFS应知应会的N个问题 | 技术点

    1. Namenode的安全模式 ? 安全模式是Namenode的一种状态(Namenode主要有active/standby/safemode三种模式). 2. 哪些情况下,Namenode会进入安 ...

随机推荐

  1. 《Java核心技术36讲》阅读笔记:谈谈对Java平台的理解笔记

    1. 谈谈你对Java平台的理解. Java是一种面向对象的语言,最显著的特性有两个方面: 一个就是一次编译,到处运行(Write once, run anywhere),能够非常容易的获得跨平台能力 ...

  2. SVG中嵌入HTML元素

    <?xml version="1.0" standalone="yes"?> <style> .clsfont{ border:1px ...

  3. 20155313 2016-2017-2 《Java程序设计》第三周学习总结

    20155313 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 4.1 类与对象 4.1.1 定义类 书本中使用了设计衣服来定义类,一件衣服的设计Cloth ...

  4. 《Java 程序设计》课堂实践三

    实践题目 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 提交测试代码和运行结果截图,加上学号水印,提交码云代码链接. 代码链接 代码链接 实践 ...

  5. pgpool-II的master-slave模式的分析

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL集群方案相关索引页     回到顶级页面:PostgreSQL索引页 现象描述: 客户来邮件,问:为何Pgpool-II ...

  6. PyQt5 结合 matplotlib 时,如何显示其 NavigationToolbar

    本文目的:展示 PyQt5 结合 matplotlib 时,如何显示其 NavigationToolbar. 本人搜遍所有网络无果,没办法,查看PyQt5源代码,最终才搞明白...特此留记. 〇.Py ...

  7. Nginx入门篇(一)之Nginx介绍

    1.简介 Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器. Nginx 是由 Igor Sysoe ...

  8. BZOJ3174. [TJOI2013]拯救小矮人(dp)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3174 题解 其实此题并不需要那么多YY的部分. 我们考虑若干个小矮人逃出的顺序.若跳出的 ...

  9. docker简单使用+django+uwsgi+nginx项目部署

    使用docker 搭建 centos7 环境: 主机环境:windows 10专业版 一.安装docker Hub.docker.com官网下载 docker for windows 安装完成后,任务 ...

  10. Saving James Bond - Easy Version (MOOC)

    06-图2 Saving James Bond - Easy Version (25 分) This time let us consider the situation in the movie & ...