Inverse 和 cascade的区别
实际上,他们是互不相关的概念:
inverse是指的关联关系的控制方向,而cascade指的是层级之间的连锁操作。
级联删除
在默认情况下,当Hibernate删除一个持久化对象时,不会自动删除与他关联的其他持久化对象,如果希望Hibernate删除Customer对象时,自动删除和Customer关联的Order对象,可以把cascade的属性设置为delete。
注意:在关联的双方的哪一方设置cascade为delete呢?是不是要在双方都要设置呢?这个主要看项目本身。
如果项目是针对一对多的,应该在“one”方设置cascade为delete,不能在“many”方设置cascade为delete 。
提示:所谓删除一个持久化对象,并不是指从内存中删除这个对象,而是从数据库中删除相关的记录。这个对象依然存在于内存中,只不过由持久化状态转变成为临时状态。
cascade属性可以有多个值,中间用逗号分开,eg:cascade="save-update,delete
<set name="orders" cascade="all-delete-orphan" inverse="true">
<key column="c_id"></key>
<one-to-many class="net.mbs.mypack.Order" />
</set>
Cascade属性的all-delete-orphan值
当我们解除Customer和Order对象之间的关系时:
customer.getOrdersa().remove(order);
order.setCustomer(null);
系统会执行 update order set c_id=null where id=? //前提: c_id列允许为null
如果希望Hibernate自动删除不再和Customer对象关联的Order对象,可以把cascade属性设置为all-delete-orphan
all-delete-orphan值的总结
1:当保存Customer对象时,级联保存所有关联的Order对象,相当于cascade=“save-update”
2:当删除Customer对象时,级联删除所有关联的Order对象,相当于cascade=“delete” .
3;删除不再和Customer对象关联的所有Order对象
当关联双方存在父子关系时,就可以把父方的cascade属性设置为“all-delete-orphan”
] 所谓父子关系,是指由父方子方的持久化生命周期,子方对象必须和一个父方对象关联
如果删除父方对象,应该级联删除所有的关联的子方对象。
如果子方对象不再和一个父方对象关联,应该把这个子方对象删除。
类与类之间是否存在父子关系是由业务逻辑需求来决定 的,通常认为Customer和Order之间存在父子关系,而Company和Worker 之间不存在父子关系。
食品类别---->蔬菜---水果
蔬菜------->西红柿类别
水果------->苹果----柿子
上面的每种类别代表一个Category对象,这些对象形成了树型数据结构,每个Category对象可以和一个父类别Category对象关联,同时还可以和一组子类别Category对象关联
为了实现上面的图例,我们制作一Category类,为了表达双向关联关系,我们在Category类中定义两个属性:
1:parentCategory:引用父类别的Category对象(比如苹果类别对象的parentCategory就是水果)
2。childCategories :引用一组子类别Category对象
现在相成的关系是
一个Category对象可以一个父Category对象关联(如水果类别对象有一个父类,而食品类别的父类是自身)
一个Category对象可以和零个(如苹果类别对象没有子类)或一组子类Category对象关联(如水果类别对象有一组子类)
数据库表方面,我们只提供了一个叫category的表,有三列
ID :标识列,表示每一类别
Name:类别的名字 ;
category_id 当前类别的父类别的id号,如果是顶级类别,如食品类别,category_id列的值自的OID。
注意 category_id列必须允许为null,否则在插入时,将丢出nullPointException异常
注意事项
1:在category.hbm.xml中应该配置set的cascade属性值为 all-delete-orphan,这样在删除一个父类别后,只要让他的所有子类别的对应的父类别为null ,就可以方便的删除所有子类别。
2:在OID中,在更新了两个类别之间的关系,并进行事务的提交后,必须调用session.clear()将session缓存进行清空,否则在以后用load()或get()加载的对象还是没有更新前的状态(如果session缓存中已经在要加载OID相同的对象)
3。在删除一个类别时,必须先删除此类别和父类别以及所有子类别的关联。
Category category=(Category)session.load(Category.class,cate.getId());
category.getParentCategory().getChildCategories().remove(category);
Object [] cs=category.getChildCategories().toArray();
System.out.println("数组长度"+cs.length);
for(int i=0;i < cs.length;i++)
{//删除和所有子类别的关联关系
Category child=(Category)cs;
chlid.setParentCategory(null);
category.getChildCategories().remove(cs);
}
session.delete(category);
分享到:
相关推荐
<set name="orders" cascade="all-delete-orphan" inverse="true"> <key column="CUSTOMER_ID"/> <one-to-many class="mypack.Order"/> ``` 这样,在运行时会执行: ```sql DELETE FROM ORDERS WHERE ...
在Java的持久化框架Hibernate中,级联操作(Cascade)和反转(Inverse)是两个重要的概念,它们主要用于管理对象关系模型中的关联关系。在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性...
在 Hibernate 框架中,`cascade` 和 `inverse` 是两个重要的概念,它们主要用于管理对象之间的持久化关系,特别是涉及到一对一(one-to-one)、一对多(one-to-many)和多对多(many-to-many)关系时。这两个属性都...
5. **all-delete-orphan**:除了`all`包含的操作外,还会删除被父对象“遗弃”的子对象(即从父对象的集合中移除但未被显式删除的子对象)。 例如,在部门和员工的例子中,如果希望当部门被删除时,其关联的所有...
例如,如果`Teacher`和`Student`的关系设置了`cascade="all-delete-orphan"`,当一个`Student`从`Teacher`的`items`集合中移除时,Hibernate会在数据库中相应地删除这个`Student`。 **2. Hibernate Inverse** `...
- `cascade="all-delete-orphan"`:结合`all`和`delete-orphan`特性,当从集合中移除对象时,会立即从数据库中删除该对象。 ### 三、持久化对象状态管理 #### 持久对象状态分类 - **Transient临时态**:仅存在于...
- `<set name="items"cascade="all-delete-orphan" inverse="true">` 描述了`Order`类中名为`items`的集合属性与数据库表的关系。`cascade="all-delete-orphan"`表示当父对象被删除时,所有孤儿子对象也将被删除。`...
<set name="orders" inverse="true" cascade="all-delete-orphan"> <key column="user_id"/> <one-to-many class="com.example.Order"/> </hibernate-mapping> ``` 2. **在子类的映射文件中**,使用`<many-...
<bag name="Employees" inverse="true" cascade="all-delete-orphan"> <key column="DepartmentId"/> <one-to-many class="Employee"/> <class name="Employee" table="Employees"> ... <many-to-one ...
这里`cascade="all-delete-orphan"`表示级联所有操作,包括删除孤儿(即当一个班级被删除时,其关联的学生也将被删除)。 四、总结 通过本教程,你可以了解到如何在Hibernate中配置和操作一对多关系,理解XML映射...
在这个例子中,`<set>`元素表示一个集合关联,`inverse="true"`表示"多方"维护关联关系,`cascade="all-delete-orphan"`表示级联操作,删除父项时会删除所有子项。 在实际操作中,我们可以通过Hibernate的Session...
`cascade="all-delete-orphan"`结合了这两种行为,不仅在删除主对象时删除关联对象,而且在主对象不再引用某个子对象时也会删除它。这种级联策略适用于具有父子关系的关联,即子对象的生命周期由父对象控制。 例如...
<set name="employees" table="Employee" inverse="true" cascade="all-delete-orphan"> <key column="deptno"/> <one-to-many class="com.example.Employee"/> ``` 这样,当删除部门时,所有关联的员工也会被...
<set name="orders" inverse="true" cascade="all-delete-orphan" lazy="false"> <key column="CUSTOMER_ID"/> <one-to-many class="mypack.Order"/> ``` 在上面的映射文件中: - `<set>` 元素用于表示一对多...
<set name="accounts" inverse="true" cascade="all-delete-orphan"> <key column="fid"/> <one-to-many class="Account"/> ``` - **解释**: - `<key column="fid">`: 表示关系另一端(多端)的关联表中和本...
many-to-one:标签中对于cascade的取值delete,delete-orphan,all-delete-orphan(只用unique属性值不为true不能出现)慎用 cascade:级联属性 none:不做任何级联操作 save-update:对当前对象执行save,update, ...