`

Hibernate 一对多关联配置

阅读更多
以Department和Employee为例。

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会进行连表查询,把两个实体都查询出来。
分享到:
评论

相关推荐

    Hibernate双向一对一关联映射(注解版)

    Hibernate双向一对一关联映射(注解版)

    Hibernate一对多关联映射(注解)

    NULL 博文链接:https://profound-accumulation.iteye.com/blog/2243079

    Hibernate ORM - 一对多双向关联关系

    NULL 博文链接:https://dreamzhong.iteye.com/blog/1200915

    Hibernate1对多1对1多对多关联映射例子源码含注解配置

    在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用...

    hibernate基于主外键的一对多/多对一关联

    hibernate基于主外键的一对多/多对一关联

    hibernate 多对一映射关联配置

    NULL 博文链接:https://yinxiaoyong.iteye.com/blog/425782

    Hibernate1对多1对1多对多关联映射例子源码含xml配置

    在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,这个是xml配置的例子

    Hibernate关联关系配置

    Hibernate关联关系配置,一对一,一对多,多对多,联合主键等的配置

    Hibernate_Annotation关联映射

    使用@OneToMany批注可定义一对多关联,一对多关联可以是双向关联。 在EJB3规范中多对一这端几乎总是双向关联中的主体(owner)端,而一对多这端关联批注为@OneToMany(mappedBy...) @Entity Public class Troop{ @...

    hibernate 体系结构与配置 参考文档(html)

    一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及...

    Hibernate3.1_学习源码

    案例目录: 01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有... 一对一、多对一、一对多、多对多等几种情况。

    Hibernate学习资料(java)

    Hibernate一对一数据关联 Hibernate下的多对多关系 Hibernate关系映射 Hibernate继承关系映射 Hibernate映射类型-主键生成器-核心API Hibernate3 插件Eclipse配置

    hibernate配置文件

    该文档总结了hibernate各种关联模式,单向多对一,单向一对多,双向一对多,双向多对多,自身一对多关联,以及oracle,mysql的相关数据库连接配置,希望对您学习有帮助。

    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. 双向关联...

    Spring和Hibernate学习笔记

    第四课:hibernate多对一关联映射 ...................... Spring: 第一课:构建Spring的环境并建立一个例子 第三课:spring Bean的作用域 第四课:spring对AOP的只是(采用Annotation的方式) 第五课:spring对AOP...

    HibernateAPI中文版.chm

    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. 双向关联...

    hibernate3.2中文文档(chm格式)

    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(PDF)第二部分

    直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、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. 双向关联...

    Hibernate 中文 html 帮助文档

    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. 双向关联,...

Global site tag (gtag.js) - Google Analytics