Hibernate inverse 和 cascade 的阐释

前提:
inverse:负责外键维护;
cascade:负责记录的添加删除修改;
基础:
Hibernate中的"inverse"属性只有两个值"true"和"false"。"true"表示将关系维护的权力交给对方,"false"表示不交出维护权力(默认值)。
Hibernate中的"cascade"-书面化的解释为"该属性会使我们在操作主对象时,同时Hibernate帮助我们完成从属对象相应的操作".
* none -- 所有情况下均不使用级联,这是默认值
* save-update -- 级联保存或更新[在执行save/update/saveOrUpdate时进行关联操作]
* delete -- 级联删除
* delete-orphan -- 孤儿删除.(注意:只能应用在一对多关系)
#* all -- 除了delete-orphan的所有情况.(包含save-update + delete )
* all-delete-orphan -- 包含了delete-orphan的所有情况.(包含save-update delete delete-orphan)
出现位置:
inverse:只能在set、list、map等几个标签中设置,像many-to-one这一类的标签都不能设置"inverse"这个属性值
cascade:一方或多方都可以.
经验之谈:
开发当中,最常见的是一对多关系<多对多会拆成两个一对多>,这两个属性大多数情况是在一方的映射文件当中配置[<set name="linkmans" inverse="true" cascade="all" lazy... fetch.... >]
代码展示:
Customer 与 Linkman 一对多
---

public class Customer {
	private Long cust_id;
	private String cust_name;
	...

	private Set<Linkman> linkmans = new HashSet<Linkman>();
	getter();setter();...
}

映射文件

<hibernate-mapping>

	<class name="domain.Customer" table="cst_customer">
		<id name="cust_id" column="cust_id">
			<generator class="native"/>
		</id>

		<property name="cust_name" column="cust_name"/>
		...

		<!-- 配置一方 -->
		<set name="linkmans"  inverse="true" cascade="all" lazy="true" fetch="subselect" >
			<key column="lkm_cust_id"/>
			<one-to-many class="domain.Linkman" />
		</set>
	</class>

</hibernate-mapping>

-------

public class Linkman {

	private Long lkm_id;
	private String lkm_name;
	...

	private Customer customer;
	getter();setter();...
}

映射文件

<hibernate-mapping>

	<class name="domain.Linkman" table="cst_linkman">
		<id name="lkm_id" column="lkm_id">
			<generator class="native"/>
		</id>

		<property name="lkm_name" column="lkm_name"/>
		...
		<!-- 先配置多方
			name	当前JavaBean中的属性
			class	属性的全路径
			column	外键的字段
		-->
		<many-to-one name="customer" class="domain.Customer" column="lkm_cust_id"  />
	</class>

</hibernate-mapping>

----Junit测试代码

	@Test
	public void run(){
		Session session = HibernateUtils.getSession();
		Transaction tr = session.beginTransaction();
		Customer c1=new Customer();
		c1.setCust_name("Jack");
		Linkman l1=new Linkman();
		l1.setLkm_name("Spider-Man"); 

		c1.getLinkmans().add(l1);
		session.saveOrUpdate(l1);
		tr.commit();
	}
  • 结果 一方记录 多方记录 保存 多方外键为空 
  • 粗略解释:

表中记录的保存只和cascade有关系,多方外键字段值的更新只和inverse有关系;在一方配置cascade="all" ,意味着保存一方时会级联
保存多方表中的记录<外键更新与否取决于inverse>,inverse="true"意味着一方放弃外键维护,外键维护权交给多方,所以多方新增的
记录中,外键的值为空.加上代码[l1.setCustomer(c1);]外键有值.

  • 相同测试代码,其它情况辨析:<没有加l1.setCustomer(c1);>
  1. 一方 inverse=false cascade=all------ 结果 一方记录 多方记录外键 全部保存
  2. 一方 inverse=true多方cascade=all------ 结果 一方记录 保存

***当保存多方对象时

	@Test
	public void run2(){
		Session session = HibernateUtils.getSession();
		Transaction tr = session.beginTransaction();
		Customer c1=new Customer();
		c1.setCust_name("Jack");
		Linkman l1=new Linkman();
		l1.setLkm_name("Spider-Man"); 

		session.saveOrUpdate(l1);
		tr.commit();
	}

---一方 inverse=true多方cascade=all------ 结果 多方记录 保存 外键为空

  	@Test
	public void run2(){
		Session session = HibernateUtils.getSession();
		Transaction tr = session.beginTransaction();
		Customer c1=new Customer();
		c1.setCust_name("Jack");
		Linkman l1=new Linkman();
		l1.setLkm_name("Spider-Man");  

		l1.setCustomer(c1);
		session.saveOrUpdate(l1);
		tr.commit();
	}

---一方 inverse=true多方cascade=all------ 结果 一方记录 多方记录外键 全部保存

对于多对多<在Stack Overflow上摘录的解释>:
In case of many-to-many relation through intermediary table; "Cascade" says whether a record will be created/updated in the child table. Whereas "Inverse" says whether a record will be created/updated in the intermediary table.
[注]:个人见解,不当之处欢迎指正.

时间: 2024-10-12 21:38:06

Hibernate inverse 和 cascade 的阐释的相关文章

hibernate:inverse、cascade,一对多、多对多详解

1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所有cascade的关系就会被自动的插入或是删除.为了能正确的cascade,unsaved-value是个很重要的属性.Hibernate通过这个属性来判断一个对象应该save还是update,如果这个对象的id是unsaved-value的话,那说明这个对象不是persistence object,要sav

Hibernate 配置文件 细节 cascade inverse

今天写东西,在配置关系时 ,随后就将cascade 配置, 而且配的值是false . 尼玛 ,结果很悲催,已启动就报错 ,弄得我云里雾里的,后来仔细检查发现原来是cascade在做该.现总结一下.顺便复习一下inverse . 1.cascade 层叠,有了它我们在操作删除和更新的时候会更加方便.只要在cascade的源头插入或者删除,所有cascade 的关系就会被动的插入或者删除.cascade 有一个值很重要,saveOrUpdate ,Hibernate根据这个属性值来判断一个对象时插

hibernate集合映射inverse和cascade详解

1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所有cascade的关系就会被自己动的插入或是删除.便是为了能正确的cascade,unsaved-value是个很重要的属性.Hibernate通过这个属性来判断一个对象应该save还是update,如果这个对象的id是unsaved-value的话,那说明这个对象不是persistence object要s

hibernate 映射 inverse and cascade详解

1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所有cascade的关系就会被自己动的插入或是删除.便是为了能正确的cascade,unsaved-value是个很重要的属性.Hibernate通过这个属性来判断一个对象应该save还是update,如果这个对象的id是unsaved-value的话,那说明这个对象不是persistence object要s

Hibernate inverse属性和cascade属性

Inverse属性 Inverse属性,是在维护关联关系的时候起作用的. 表示控制权是否转移.(在一的一方起作用) Inverse , 控制反转. Inverse = false  不反转:   当前方有控制权 True  控制反转: 当前方没有控制权 维护关联关系中,是否设置inverse属性: 1.保存数据                    有影响. 如果设置控制反转,即inverse=true, 然后通过部门方维护关联关系.在保存部门的时候,同时保存员工,数据会保存,但关联关系不会维护

Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; private String userName; // 一个用户,对应的多个地址 private Set<String> address; private List<String> addressList = new ArrayList<String>(); //private Str

一对多(多对一)关系中的inverse和cascade属性

首先说一下inverse: "inverse" 直译过来就是"反转,使颠倒"的意思,书面化的解释为"是否将关系维护的权力交给对方" 1. 在hibernate中inverse默认是false,也就是己方拥有维护关系的权利, 当然为true的话,就是把维护关系的权利交给了对方 2. 在一对多的关系(多对一)中,通常将一端的inverse设置为false(一端设为true的话会多出更新语句,有性能问题,下面会讲到),而多对多的关系中,inverse的

Hibernate inverse用法(转载)

出处:http://blog.csdn.net/xiaoxian8023/article/details/15380529 一.Inverse是hibernate双向关系中的基本概念.inverse的真正作用就是指定由哪一方来维护之间的关联关系.当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录! Hibernate仅仅按照主控方对象的状态的变化来同步更新数据库.按照原来的映射文件,people.

Hibernate异常之cascade

1 org.hibernate.MappingException: Unsupported cascade style: delete-option 2 at org.hibernate.engine.spi.CascadeStyles.getCascadeStyle(CascadeStyles.java:257) 3 at org.hibernate.mapping.Property.getCascadeStyle(Property.java:140) 4 at org.hibernate.m