设想一下部门与员工的关系,如果一个部门有几百个员工,则我们在存储数据的时候,需要一次的保存每个员工的信息,如果能在对部门进行操作的时候,把员工的信息也进行相对应的操作,那就方便多了,Hibernate中的Cascade便可以解决上述问题。
Cascade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade:none,all,save-update,delete,lock,refresh,evict,replicate,persist,merge,delete-orphan(one-to-many)。
一般对many-to-one,many-to-many不设置级联,在<one-to-one>和<one-to-many>中设置级联。
package org.hibernate.domain; import java.util.Set; public class Department { private int id; private String name; private Set<Employee> employees; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Employee> getEmployees() { return employees; } public void setEmployees(Set<Employee> employees) { this.employees = employees; } @Override public String toString() { return "Department [id=" + id + ", name=" + name + ", employees=" + employees + "]"; } }
package org.hibernate.domain; public class Employee { private int id; private String name; private Department department; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } @Override public String toString() { return "Employee [id=" + id + ", name=" + name + ", department=" + department + "]"; } }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.hibernate.domain"> <class name="Department" table="department"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <set name="employees" cascade="save-update"> <key column="department_id" /> <one-to-many class="Employee" /> </set> </class> </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.hibernate.domain"> <class name="Employee" table="employee"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <!-- 如果忽略了column这个属性那么默认的外键与实体的属性一致 --> <many-to-one name="department" column="department_id" /> </class> </hibernate-mapping>
测试类如下:
package org.hibernate.test; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.domain.Department; import org.hibernate.domain.Employee; import org.hibernate.util.HibernateUtil; import junit.framework.TestCase; public class CascadeTest extends TestCase { public void testCascade() { Session session = null; Transaction tx = null; try { Department department = new Department(); department.setName("department name"); Set<Employee> employees = new HashSet<Employee>(); Employee emp1 = new Employee(); emp1.setDepartment(department);// 对象模型:建立两个对象的关联 emp1.setName("emp1 name"); employees.add(emp1); Employee emp2 = new Employee(); emp2.setDepartment(department);// 对象模型:建立两个对象的关联 emp2.setName("emp2 name"); employees.add(emp2); department.setEmployees(employees); session = HibernateUtil.getSession(); tx = session.beginTransaction(); session.save(department); tx.commit(); } finally { if (session != null) session.close(); } } }
从代码中可以看到Hibernate只对部门进行了保存
控制台输出结果如下:
从结果可以看出,在保存部门的时候,员工的信息也进行了相应的更新。
设想在一个班级,如果辅导员需要记住整个专业同学的名字,这需要一段时间,但是如果只是让学生记住辅导员的名字,这就简单多了,Hibernate中的inverse属性就可以模拟此种现象
inverse"表示是否放弃维护关联关系“(在Java里两个对象产生关联时,对数据库表的影响),在one-to-many和many-to-many的集合定义中使用,inverse=”true”表示该对象不维护关联关系;该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值是false)。
one-to-many维护关联关系就是更新外键。
many-to-many维护关联关系就是在中间表增减记录。
注: 配置成one-to-one的对象不维护关联关系
还是上面部门与员工的例子,此时部门的配置文件如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.hibernate.domain"> <class name="Department" table="department"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <set name="employees"> <key column="department_id" /> <one-to-many class="Employee" /> </set> </class> </hibernate-mapping>
测试类:
package org.hibernate.test; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.domain.Department; import org.hibernate.domain.Employee; import org.hibernate.util.HibernateUtil; import junit.framework.TestCase; public class InverseTest extends TestCase { public void testInverse() { Session session = null; Transaction tx = null; try { Department department = new Department(); department.setName("department name"); Set<Employee> employees = new HashSet<Employee>(); Employee emp1 = new Employee(); emp1.setDepartment(department);// 对象模型:建立两个对象的关联 emp1.setName("emp1 name"); employees.add(emp1); Employee emp2 = new Employee(); emp2.setDepartment(department);// 对象模型:建立两个对象的关联 emp2.setName("emp2 name"); employees.add(emp2); department.setEmployees(employees); session = HibernateUtil.getSession(); tx = session.beginTransaction(); session.save(department); session.save(emp1); session.save(emp2); tx.commit(); } finally { if (session != null) session.close(); } } }
控制台输出结果如下:
结果中的两条update语句由
department.setEmployees(employees);
而产生
如果此时在部门的配置文件中加入inverse属性:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.hibernate.domain"> <class name="Department" table="department"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <set name="employees" inverse="true"> <key column="department_id" /> <one-to-many class="Employee" /> </set> </class> </hibernate-mapping>
则此时部门与员工之间的关系就只由员工来维护,更改配置文件后控制台输出结果如下:
虽然测试类中还有
department.setEmployees(employees);
但此时的关系已由员工来维护了,所以update已经没有了,当然,配置了inverse属性,也可以提高
Hibernate的效率。
相关推荐
Hibernate中cascade与inverse属性详解
在 Hibernate 框架中,`cascade` 和 `inverse` 是两个重要的概念,它们主要用于管理对象之间的持久化关系,特别是涉及到一对一(one-to-one)、一对多(one-to-many)和多对多(many-to-many)关系时。这两个属性都...
在Java的持久化框架Hibernate中,级联操作(Cascade)和反转(Inverse)是两个重要的概念,它们主要用于管理对象关系模型中的关联关系。在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性...
总之,理解并熟练运用Hibernate的关联映射、cascade和inverse是提升Java持久化编程能力的关键步骤。它们可以帮助我们更高效地管理对象与数据库之间的关系,同时降低开发复杂度。通过实践和研究给出的示例,相信你...
### Hibernate Inverse 和 Cascade 的详细讲解 #### 一、引言 在ORM(Object-Relational Mapping)领域,Hibernate作为一款流行的Java持久层框架,它提供了丰富的API和配置选项来帮助开发者实现对象与数据库表之间...
在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...
在深入探讨Hibernate集合映射中的`inverse`与`cascade`属性之前,我们首先需要理解Hibernate框架的基本概念。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用程序提供了一种将对象模型与数据库...
在压缩包文件“inverse_cascade”中,可能包含了与这个主题相关的代码示例、教程文档或者其他资源。这些文件可能帮助读者更深入地理解这两个概念,并能动手实践,从而更好地掌握在实际项目中如何应用“inverse”和...
Hibernate中Inverse和Cascade的区别.html
在Hibernate框架中,cascade选项提供了一种管理实体间关联的便捷方式,使得对一个实体的操作能够自动地应用到与之相关的其他实体上。这对于处理复杂的数据库关系非常有用,可以极大地简化代码,并减少出错的可能性。...
在软件网络技术领域,尤其是在使用Hibernate这种对象关系映射(ORM)框架时,理解和正确使用`cascade`和`inverse`属性至关重要。这两个属性主要用于管理对象之间的关联关系,特别是如何在数据库中维护这些关系。 ...
1. **关联的插入和更新**:在一对多关系中,如果设置`inverse="true"`,那么在保存或更新父实体时,Hibernate会自动处理与子实体的关联,添加新的子实体或更新已存在的关联。相反,如果在子实体上操作,Hibernate将...
hibernate中一对一,一对多,多对多关系的配置,延迟加载,cascade,inverse hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式
在Hibernate中,`cascade`和`inverse`是两个重要的概念,它们涉及到对象之间的关系管理和数据持久化。 **1. Hibernate Cascade** `cascade`属性主要用于控制对象间的级联操作。当在主对象上执行保存、更新、删除等...
描述提到“使用cascade和inverse优化区和街道关联关系”,这意味着我们将深入理解Hibernate的cascade和inverse属性,以及它们在双向一对多关联关系中的应用。 Hibernate是Java领域中广泛使用的对象关系映射(ORM)...
根据提供的文件信息,我们可以深入探讨Hibernate框架中的几个关键概念,特别是`fetch`, `lazy`, `cascade`, 和 `inverse`关键字的使用与理解。这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下...
理解并正确使用Hibernate的`cascade`和`inverse`属性对于优化数据操作和避免数据一致性问题至关重要。在实际开发中,应根据业务逻辑和数据模型谨慎设定这些属性,以确保数据操作的正确性和高效性。
总结,`inverse=true`是Hibernate中管理双向一对多关联的重要属性,它影响了对象与数据库之间的同步策略。理解并正确运用这个特性,有助于我们编写出更加高效、易维护的代码。通过阅读相关博客和源码,我们可以更...