- 浏览: 1238302 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (193)
- ant/maven (6)
- algorithm (5)
- tomcat/weblogic/jboss (6)
- javascript/jquery (13)
- java (33)
- flex/flash (0)
- JPA/Hibernate/myBatis (18)
- java concurrent (7)
- test (2)
- windows/linux (6)
- java collection (7)
- design pattern (2)
- life/health (3)
- database (12)
- IDE (4)
- spring/ejb (20)
- html/css/ckeditor (7)
- jsp/servlet (3)
- java io (13)
- java security (4)
- jni (0)
- svn/git (2)
- english (2)
- java jmx (1)
- xml (1)
- struts/springmvc (9)
- middleware (2)
- cache (1)
- cglib (3)
最新评论
-
jlotusYo:
博主,真感谢。
Java 密码扩展无限制权限策略文件 -
senninha:
这个。。是api说明吧。。
ScheduledExecutorService 源码分析 -
zoutao2008:
请问大文件如何处理?按你这种方式的话,文件超过200M时就会报 ...
hessian系列之二:上传文件 -
lwj1113:
lwj1113 写道谢谢博主这么细致的demo;在系列五中通过 ...
myBatis系列之五:与Spring3集成 -
lwj1113:
谢谢博主这么细致的demo;在系列五中通过testng测试类跑 ...
myBatis系列之五:与Spring3集成
以Department和Employee为例。
Department类:
Employee类:
Department.hbm.xml:
如果key的column属性不指定,则employee表中没有department的外键。
key的foreign-key属性指定key的名称。
如果one-to-many的class不指定,hibernate生成表时会报错。
Employee.hbm.xml:
1. 测试cascade属性
结果报错:org.hibernate.TransientObjectException
因为em1和em2是两个瞬时对象。
解决办法是:
a. 在代码里加上s.save(em1); s.save(em2);
或者
b. 给set加上cascade="save-update"或者cascade="all"。
2. 测试inverse属性:
set的inverse属性默认是false的,也就是由department维护关系。如果修改为true,执行上面的testSave方法,结果报错:Field 'depart_id' doesn't have a default value
这时关系由Employee维护,但是它没有机会(因为没有调用s.save(em1)和s.save(em2)),那么employee表中的depart_id就会是null值,和not-null=true的约束产生冲突。
3. 测试lazy, fetch属性
a. 当fetch为select时:
如果lazy为true,hibernate用SELECT语句查询出Department。当访问Employee时才用SELECT语句查询Employee,如果这时session已经关闭,会导致异常。
如果lazy为false,hibernate在get方法执行的时候用两个SELECT语句把Department和Employee都查询出来。
b. 当fetch为join时:
不管lazy的取值,hibernate会进行连表查询,把两个实体都查询出来。
Department类:
public class Department { private int id; private String name; // For one-to-many association private Set<Employee> employees; public Department() { } public Department(String name) { this.name = name; } // Getters and setters are omitted
Employee类:
public class Employee { private int id; private String name; public Employee() { } public Employee(String name) { this.name = name; } // Getters and setters are omitted
Department.hbm.xml:
<hibernate-mapping package="com.john.myhibernate.domain"> <class name="Department"> <id name="id"> <generator class="native"/> </id> <property name="name" length="20" not-null="true"/> <set name="employees" lazy="true" fetch="select"> <key column="depart_id" not-null="true" foreign-key="slender"></key> <one-to-many class="Employee"/> </set> </class> </hibernate-mapping>
如果key的column属性不指定,则employee表中没有department的外键。
key的foreign-key属性指定key的名称。
如果one-to-many的class不指定,hibernate生成表时会报错。
Employee.hbm.xml:
<hibernate-mapping package="com.john.myhibernate.domain"> <class name="Employee"> <id name="id"> <generator class="native"/> </id> <property name="name" length="20" not-null="true"/> </class> </hibernate-mapping>
1. 测试cascade属性
public void testSave() { Session s = null; Transaction tx = null; Department depart = new Department("FDI"); Employee em1 = new Employee("Jacy"); Employee em2 = new Employee("Neil"); Set<Employee> employees = new HashSet<Employee>(); employees.add(em1); employees.add(em2); depart.setEmployees(employees); try { s = HibernateUtil.getSession(); tx = s.beginTransaction(); s.save(depart); tx.commit(); } catch (HibernateException e) { tx.rollback(); e.printStackTrace(); } finally { if (s != null) s.close(); } }
结果报错:org.hibernate.TransientObjectException
因为em1和em2是两个瞬时对象。
解决办法是:
a. 在代码里加上s.save(em1); s.save(em2);
s.save(em1); s.save(em2); s.save(depart);
或者
b. 给set加上cascade="save-update"或者cascade="all"。
<hibernate-mapping <set name="employees" lazy="true" fetch="select" cascade="save-update"> </hibernate-mapping>
2. 测试inverse属性:
set的inverse属性默认是false的,也就是由department维护关系。如果修改为true,执行上面的testSave方法,结果报错:Field 'depart_id' doesn't have a default value
这时关系由Employee维护,但是它没有机会(因为没有调用s.save(em1)和s.save(em2)),那么employee表中的depart_id就会是null值,和not-null=true的约束产生冲突。
3. 测试lazy, fetch属性
public void testQueryLazy() { Session s = null; s = HibernateUtil.getSession(); Department depart = (Department) s.get(Department.class, 2); s.close(); System.out.println(depart.getName()); System.out.println(depart.getEmployees()); }
a. 当fetch为select时:
如果lazy为true,hibernate用SELECT语句查询出Department。当访问Employee时才用SELECT语句查询Employee,如果这时session已经关闭,会导致异常。
如果lazy为false,hibernate在get方法执行的时候用两个SELECT语句把Department和Employee都查询出来。
b. 当fetch为join时:
不管lazy的取值,hibernate会进行连表查询,把两个实体都查询出来。
发表评论
-
myBatis系列之七:事务管理
2014-04-01 15:36 103949myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之八:分页查询
2014-01-13 22:07 0分页查询:物理分页,不是内存分页: 1. 在sql语句中指定 ... -
myBatis系列之六:与SpringMVC集成
2013-12-26 13:33 5909myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之五:与Spring3集成
2013-12-09 14:31 5000myBatis系列之一:搭建开 ... -
myBatis系列之四:关联数据的查询
2013-12-08 13:36 9722myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之三:增删改查
2013-12-01 22:36 5045myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之二:以接口方式交互数据
2013-11-25 22:46 12371myBatis系列之一:搭建开发环境 myBatis系列之三: ... -
myBatis系列之一:搭建开发环境
2013-11-18 22:00 8550myBatis系列之二:以接口方式交互数据 myBatis系列 ... -
JPA 一对一关联
2012-08-18 17:12 3244在一对一关联中,JPA没有规定谁为关系的维护方,OneToOn ... -
Hibernate 集合类型使用
2012-08-11 18:31 1342为了映射实体中的集合 ... -
Hibernate 组件关联关系
2012-08-11 15:10 1250实体关联的属性是个复杂类型的持久化类,但不是实体:数据库中没有 ... -
Hibernate 继承关系配置
2012-08-08 23:33 4057以Department和Employee实体为例。Develo ... -
Hibernate 多对一关联配置
2012-08-08 21:51 28302实体是Employee和Department,它们之间是多对一 ... -
Hibernate 查询分析
2012-08-08 19:15 0private void fireLoad(LoadEv ... -
Hibernate 配置文件
2012-07-25 20:17 0<properties> < ... -
jdbc 批处理操作
2012-05-15 15:43 1417jdbc的批处理操作是指把一组SQL语句(增删改操作)一次性提 ... -
jdbc调用postgreSQL数据库内置函数
2012-05-08 16:02 31271. current_timestamp 返回的是当前的 ... -
构建Hibernate项目
2012-04-25 20:35 01. 新建一个Java Project 2. 添加hiber ... -
乐观锁与悲观锁
2012-04-24 22:50 2770悲观锁: 读取数据的时候对记录加锁,直到提交数据更新后解锁 ... -
Hibernate映射文件的配置
2012-04-20 22:21 01. type值不是指java类型或者数据库的类型,而是Hib ...
相关推荐
Hibernate双向一对一关联映射(注解版)
NULL 博文链接:https://profound-accumulation.iteye.com/blog/2243079
NULL 博文链接:https://dreamzhong.iteye.com/blog/1200915
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用...
hibernate基于主外键的一对多/多对一关联
NULL 博文链接:https://yinxiaoyong.iteye.com/blog/425782
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,这个是xml配置的例子
Hibernate关联关系配置,一对一,一对多,多对多,联合主键等的配置
使用@OneToMany批注可定义一对多关联,一对多关联可以是双向关联。 在EJB3规范中多对一这端几乎总是双向关联中的主体(owner)端,而一对多这端关联批注为@OneToMany(mappedBy...) @Entity Public class Troop{ @...
一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及...
案例目录: 01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有... 一对一、多对一、一对多、多对多等几种情况。
Hibernate一对一数据关联 Hibernate下的多对多关系 Hibernate关系映射 Hibernate继承关系映射 Hibernate映射类型-主键生成器-核心API Hibernate3 插件Eclipse配置
该文档总结了hibernate各种关联模式,单向多对一,单向一对多,双向一对多,双向多对多,自身一对多关联,以及oracle,mysql的相关数据库连接配置,希望对您学习有帮助。
6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联...
第四课:hibernate多对一关联映射 ...................... Spring: 第一课:构建Spring的环境并建立一个例子 第三课:spring Bean的作用域 第四课:spring对AOP的只是(采用Annotation的方式) 第五课:spring对AOP...
6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联...
6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联...
直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...
6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联...
6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,...