`

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一对多关联配置 #### XML配置方式: 在Hibernate的映射文件中,我们通常会在一方(拥有端)的实体类映射文件中添加`&lt;set&gt;`或`&lt;list&gt;`标签来表示一对多关系。以下是一个简单的例子: ```xml &lt;!-- "一"端...

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

    本篇主要探讨的是Hibernate中的一对多关联映射,它允许一个实体对象对应数据库表中的多个行。在实际业务场景中,这种映射模式非常常见,例如一个用户可以拥有多个订单,一个部门可以包含多个员工等。 首先,我们来...

    hibernate一对多关联映射(单向关联)

    这篇博客文章“hibernate一对多关联映射(单向关联)”将深入讲解如何配置和使用这种映射关系。 在单向关联中,只有一个实体知道另一个实体的存在,也就是说,只有父实体("一"的一端)有对子实体("多"的一端)的...

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    hibernate一对一关联关系

    在实体类之间,Hibernate支持多种关联关系,包括一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)。本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,...

    hibernate多对一关联demo

    【标题】:“Hibernate多对一关联demo” 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作。本教程将详细解释如何在Hibernate中实现多对一的关联关系,以及如何通过一个实际的示例...

    Hibernate一对多使用非主键关联设置

    在保存或更新实体时,Hibernate会自动处理一对多关联的插入或更新。 通过这种方式,我们就可以在Hibernate中设置一对多非主键关联,使得在操作部门和员工数据时,能够方便地维护它们之间的关系。这种方法允许我们在...

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

    这个压缩包文件“HibernateORM”很可能包含了关于如何在实际项目中设置和使用Hibernate一对多双向关联的示例代码、配置文件或者详细教程。通过学习这些材料,开发者能够深入理解如何在Java应用中利用Hibernate来处理...

    hibernate一对多,多对一,一对多双向关联

    本主题将主要聚焦在一对一和一对多关联。 2. **关联的方向性:** 关联可以是单向或双向的。单向关联只能从一个实体访问另一个,而双向关联允许两个实体之间互相访问。 3. **@OneToOne, @OneToMany, @ManyToOne ...

    Hibernate一对多关联实例

    本文将详细解析" Hibernate一对多关联实例 ",并涵盖关联的保存(save)、删除(delete)、查询(select)和更新(update)操作。 一、一对多关联概念 在数据库设计中,一对多关联表示一个表中的记录可以与另一个表中的多个...

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

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    Hibernate一对多关联

    标题 "Hibernate一对多关联" 涉及到的是Java持久化框架Hibernate中的一个重要关系映射概念,这在开发企业级应用时非常常见。在数据库设计中,一对多关系表示一个表(父表)中的记录可以与另一个表(子表)中的多个...

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

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...

    hibernate多对多关联映射(单项关联)

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...

    hibernate 一对多关联

    **标题:“Hibernate 一对多关联”** 在Java的持久化框架Hibernate中,一对多关联是一种常见的关系映射,它模拟了数据库中的外键关联。这种关联类型表示一个实体(如用户)可以拥有多个关联的实体(如订单)。下面...

    hibernate一对多关联映射

    一、Hibernate一对多关联映射 1.1 单向关联:在单向一对多关联中,一个实体类知道另一个实体类,而另一个实体类并不知情。这通常通过在一方添加一个集合属性来实现,该集合包含另一方的实例。例如,`Department`类...

    hibernate多对一单向关联关系实现源码

    在Java的持久化框架Hibernate中,多对一(ManyToOne)关联关系是一种常见的对象关系映射(ORM)场景。这种关系通常出现在一个实体类拥有多条与另一个实体类相关的记录,而另一个实体类可能只有一条对应的记录。例如...

    hibernate一对多、多对一、一对一、多对多配置实例

    本文将深入探讨Hibernate中的一对多、多对一、一对一以及多对多四种关系映射的配置实例,帮助开发者更好地理解和运用这些关系。 ### 一对多关系(One-to-Many) 在数据库设计中,一对多关系是最常见的一种关联,...

    Hibernate基于连接表的一对多单向关联

    在数据库设计中,一对多关联是指一个表中的记录可以对应另一个表中的多个记录,例如,一个部门可以有多个员工。在这个场景中,我们将探讨如何使用Hibernate来实现这种关系。 首先,我们来看“连接表”的概念。在一...

    Hibernate多表关联配置及错误解决方法

    一对多关联意味着一个实体可以与多个另一个实体相关联。例如,`Teacher`可以有多个`Student`: ```java @Entity @Table(name="Teacher") public class Teacher { @OneToMany(mappedBy = "teacher") private Set...

Global site tag (gtag.js) - Google Analytics