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. 20155313 2016-2017-2 《Java程序设计》第二周学习总结

    20155313 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 1.1 基本类型 整数:可细分为short整数(占2字节).int整数(占4字节)与long ...

  2. adb的配置

    http://jingyan.baidu.com/article/2fb0ba405e815f00f2ec5f9e.html 1. 用快捷键Ctrl + Alt + T 打开终端命令工具,电脑不要插入 ...

  3. WPF MVVM从入门到精通1:MVVM模式简介

    原文:WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 W ...

  4. FFT&NTT总结

    FFT&NTT总结 一些概念 \(DFT:\)离散傅里叶变换\(\rightarrow O(n^2)\)计算多项式卷积 \(FFT:\)快速傅里叶变换\(\rightarrow O(nlogn ...

  5. angularJS ng-repeat中的directive 动态加载template

    有个需求,想实现一个html组件,传入不同的typeId,渲染出不同的表单元素. <div ng-repeat="field in vm.data"> <magi ...

  6. Javascript格式化并高亮xml字符串

    Javascript格式化并高亮xml字符串 两个关键点 使用DOMParser解析xml 递归遍历xml树,按格式输出每一个节点 关于使用DOMParser 此方法目前在IE9以上和其它浏览器里都是 ...

  7. 探究linux设备驱动模型之——platform虚拟总线(三)最终章

    这篇是最终章了,结束这一章后,对于platform平台总线驱动的使用方法应该是能够无压力掌握.但是这一章涉及的内容会比前面两章多一些. 我们会一步一步地来完善上一章的例子.完善的目的是能够在应用层去控 ...

  8. python根据正则表达式的简单爬虫

    今天根据正则表达式简单的爬了一下大众点评,把北京的美食爬了爬,(店铺名,人均消费,地址) import re import urllib.request from urllib.request imp ...

  9. Java的安装与配置

    安装JAVA 下载JAVA JDK安装包,JDK是Java Development Kit的缩写,即开发工具包,里面包含了平时用户用到的JRE,也就是Java Runtime Enviroment运行 ...

  10. Jmeter接口测试(四)传递参数

    参数设置 Jmeter 支持通过 查询字符串参数(Query String Parameters) 或者 Request body 请求体来传递参数. 1.get请求是普通键值对 get请求一般通过p ...