- 浏览: 1250043 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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 104057myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之八:分页查询
2014-01-13 22:07 0分页查询:物理分页,不是内存分页: 1. 在sql语句中指定 ... -
myBatis系列之六:与SpringMVC集成
2013-12-26 13:33 5967myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之五:与Spring3集成
2013-12-09 14:31 5060myBatis系列之一:搭建开 ... -
myBatis系列之四:关联数据的查询
2013-12-08 13:36 9780myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之三:增删改查
2013-12-01 22:36 5106myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之二:以接口方式交互数据
2013-11-25 22:46 12432myBatis系列之一:搭建开发环境 myBatis系列之三: ... -
myBatis系列之一:搭建开发环境
2013-11-18 22:00 8608myBatis系列之二:以接口方式交互数据 myBatis系列 ... -
JPA 一对一关联
2012-08-18 17:12 3287在一对一关联中,JPA没有规定谁为关系的维护方,OneToOn ... -
Hibernate 集合类型使用
2012-08-11 18:31 1383为了映射实体中的集合 ... -
Hibernate 组件关联关系
2012-08-11 15:10 1307实体关联的属性是个复杂类型的持久化类,但不是实体:数据库中没有 ... -
Hibernate 继承关系配置
2012-08-08 23:33 4099以Department和Employee实体为例。Develo ... -
Hibernate 多对一关联配置
2012-08-08 21:51 28358实体是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 1466jdbc的批处理操作是指把一组SQL语句(增删改操作)一次性提 ... -
jdbc调用postgreSQL数据库内置函数
2012-05-08 16:02 31731. current_timestamp 返回的是当前的 ... -
构建Hibernate项目
2012-04-25 20:35 01. 新建一个Java Project 2. 添加hiber ... -
乐观锁与悲观锁
2012-04-24 22:50 2828悲观锁: 读取数据的时候对记录加锁,直到提交数据更新后解锁 ... -
Hibernate映射文件的配置
2012-04-20 22:21 01. type值不是指java类型或者数据库的类型,而是Hib ...
相关推荐
Hibernate一对多关联配置 #### XML配置方式: 在Hibernate的映射文件中,我们通常会在一方(拥有端)的实体类映射文件中添加`<set>`或`<list>`标签来表示一对多关系。以下是一个简单的例子: ```xml <!-- "一"端...
本篇主要探讨的是Hibernate中的一对多关联映射,它允许一个实体对象对应数据库表中的多个行。在实际业务场景中,这种映射模式非常常见,例如一个用户可以拥有多个订单,一个部门可以包含多个员工等。 首先,我们来...
这篇博客文章“hibernate一对多关联映射(单向关联)”将深入讲解如何配置和使用这种映射关系。 在单向关联中,只有一个实体知道另一个实体的存在,也就是说,只有父实体("一"的一端)有对子实体("多"的一端)的...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...
在实体类之间,Hibernate支持多种关联关系,包括一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)。本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,...
【标题】:“Hibernate多对一关联demo” 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作。本教程将详细解释如何在Hibernate中实现多对一的关联关系,以及如何通过一个实际的示例...
在保存或更新实体时,Hibernate会自动处理一对多关联的插入或更新。 通过这种方式,我们就可以在Hibernate中设置一对多非主键关联,使得在操作部门和员工数据时,能够方便地维护它们之间的关系。这种方法允许我们在...
这个压缩包文件“HibernateORM”很可能包含了关于如何在实际项目中设置和使用Hibernate一对多双向关联的示例代码、配置文件或者详细教程。通过学习这些材料,开发者能够深入理解如何在Java应用中利用Hibernate来处理...
本主题将主要聚焦在一对一和一对多关联。 2. **关联的方向性:** 关联可以是单向或双向的。单向关联只能从一个实体访问另一个,而双向关联允许两个实体之间互相访问。 3. **@OneToOne, @OneToMany, @ManyToOne ...
本文将详细解析" Hibernate一对多关联实例 ",并涵盖关联的保存(save)、删除(delete)、查询(select)和更新(update)操作。 一、一对多关联概念 在数据库设计中,一对多关联表示一个表中的记录可以与另一个表中的多个...
本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...
标题 "Hibernate一对多关联" 涉及到的是Java持久化框架Hibernate中的一个重要关系映射概念,这在开发企业级应用时非常常见。在数据库设计中,一对多关系表示一个表(父表)中的记录可以与另一个表(子表)中的多个...
在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...
**标题:“Hibernate 一对多关联”** 在Java的持久化框架Hibernate中,一对多关联是一种常见的关系映射,它模拟了数据库中的外键关联。这种关联类型表示一个实体(如用户)可以拥有多个关联的实体(如订单)。下面...
一、Hibernate一对多关联映射 1.1 单向关联:在单向一对多关联中,一个实体类知道另一个实体类,而另一个实体类并不知情。这通常通过在一方添加一个集合属性来实现,该集合包含另一方的实例。例如,`Department`类...
在Java的持久化框架Hibernate中,多对一(ManyToOne)关联关系是一种常见的对象关系映射(ORM)场景。这种关系通常出现在一个实体类拥有多条与另一个实体类相关的记录,而另一个实体类可能只有一条对应的记录。例如...
本文将深入探讨Hibernate中的一对多、多对一、一对一以及多对多四种关系映射的配置实例,帮助开发者更好地理解和运用这些关系。 ### 一对多关系(One-to-Many) 在数据库设计中,一对多关系是最常见的一种关联,...
在数据库设计中,一对多关联是指一个表中的记录可以对应另一个表中的多个记录,例如,一个部门可以有多个员工。在这个场景中,我们将探讨如何使用Hibernate来实现这种关系。 首先,我们来看“连接表”的概念。在一...
一对多关联意味着一个实体可以与多个另一个实体相关联。例如,`Teacher`可以有多个`Student`: ```java @Entity @Table(name="Teacher") public class Teacher { @OneToMany(mappedBy = "teacher") private Set...