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一些封装好的常用算法

    1.简单排序Collections.sort(): //简单排序 List<String> staff= new LinkedList<>(); staff.add(" ...

  2. excel中CTRL+E的用法

    偶然发现excel中CTRL+E有按照例子填充的功能. 结果如下

  3. 20155226 实验一《Java开发环境的熟悉》实验报告

    20155226 实验一<Java开发环境的熟悉>实验报告 一. 实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 输入cd Code进入Code文件夹里 ...

  4. 20155315实验三 敏捷开发与XP实践

    实验内容 1.XP基础 2.XP核心实践 3.相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程: 2.完成实验.撰 ...

  5. [BZOJ1492][NOI2007]cash-[cdq分治]

    Description 传送门 Solution 首先,最优情况一定是某一天把所有金券卖出或买入是最优的. 在金券一定的情况下,分散卖一定没有统一在最优的那天卖更优. 然后,我们假定在某一天卖,则在该 ...

  6. 使GDAL库支持中文路径或中文文件名的处理方法

    之前生成的gdal 2.1.1动态库,在通过命令行执行时,遇到有中文路径或中文图像名时,GDALOpen函数不能正确的被调用,如下图: 解决方法: 1.      在所有使用GDALAllRegist ...

  7. Windows server 2008 IIS7发布asp.net mvc网站css、js脚本无法访问 问题解决

    今天发布网站遇到一个感到很无语的问题,网站发布成功,浏览网站内容数据显示正常,就是没有样式,试了下脚本也是没有反应,如图效果: 接下来就是一顿苦找原因,检查iis设置.什么应用程序池.文件路径等各种检 ...

  8. 【vijos1049】送给圣诞夜的礼品

    题面 描述 当小精灵们把贺卡都书写好了之后.礼品准备部的小精灵们已经把所有的礼品都制作好了.可是由于精神消耗的缘故,他们所做的礼品的质量越来越小,也就是说越来越不让圣诞老人很满意.可是这又是没有办法的 ...

  9. 小计Tomcat的调优思路

    描述 最近在补充自己的短板,刚好整理到Tomcat调优这块,基本上面试必问,于是就花了点时间去搜集一下tomcat调优 都调了些什么,先记录一下调优手段,更多详细的原理和实现以后用到时候再来补充记录, ...

  10. 使用GitLab创建项目