hibernate 关联关系

本文介绍Hibernate ORM框架中的级联操作设置及其影响,包括一对多关联映射方式,如many-to-one与one-to-many标签的使用,并探讨了级联选项all与all-delete-orphan的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.

<many-to-one name="customer" column="customer_id" 
                class="mypack.Customer" 
                cascade="save-upate" not-null="true" />
 

 cascade="save-upate" 级联保存更新,默认none

 

2.

<set name ="orders" cascade="save-update" inverse="true">
     <key column="customer_id">
     <one-to-many class="mypack.Order"/>
</set>
 

把"one"方属性 inverse="true" 可以提高应用性能

 

3.

cascade为all-delete-orphan和all区别
Parent和Children为一对多关系。

Children child1 = new Children();
child1.setName("c1");
Children child2 = new Children();
child2.setName("c2");
Parent parent = new Parent("p1");
Set children = new HashSet(0);

parent.getChildren().add(child1);
parent.getChildren().add(child2);

child1.setParent(parent);
child2.setParent(parent);


session = HibernateServiceProvider.getSession();
tran = session.beginTransaction();

session.save(parent);
session.save(child1);
session.save(child2);
session.flush();
queryChildren(parent);
//queryParent(child1);

parent.getChildren().remove(child1);//删除子对象!!!!!
session.flush();

//queryChildren(parent);

tran.commit();
session.close(); 
 


当<set name="children" inverse="true" cascade="all">时,通过parent.getChildren().remove(child1);只是使child1游离成为一个 “孤儿”,并不能将child1持久化到数据库表中的记录也删除。但如果cascade="all-delete-orphan"(orphan为“孤 儿”),则会将child1持久化到数据库表中的记录也删除掉。

 

all-delete-orphan

  • 当保存或更新时,相当于 cascade = "save-update"
  • 当删除时,相当于 cascade = "delete"

 

4.一对多双向自身关联

 

以category为例,它代表商品类别,存在一对多双向关联。如:食品 类别包括蔬菜类型和水果类型,水果类型又包括苹果类别和桔子类别。每一种类别代表一个category对象,这些对象形成了树型数据结构。每个 category可以和一个父类别catetory对象关联,同时还可以和一组子类别category对象关联。为了表达这种一对多双向自身关联,可以在 category类中定义两个属性parentCategory(引用父类别对象)和 childCategory(引用一组子类别对象)。
Category 表两个字段: id 和name,category_id
Category 持久化类代码片段如下:

 

public class Category implements Serializable{
   private Category parentCategory;
   private Category childCategory;
 
   public Category getParentCategory(){………}
   public void setParentCategory(){………}
   public Category getChildCategory(){………}
   public void setChildCategory(){………}
 
}
   
Category 类的映射文件如下:
……
<many-to-one name="parentCategory" column="category_id" class="mypack.Category"/>
 
<set name="childCategory" cascade="save-update" inverse="true">
    <key column="category_id"/>
    <one-to-many class="mypack.Category"/>
 </set> 
……

 

注意:这个映射文件中包含<many-to-one>和<set>这个以下两种映射类型中的元素。它引用了parentCategory和childCategory属性来解决父子之间的关联。
总结:一对多双向自身关联关系,在映射文件中用<many-to-one>映射对应的one属性;用<set>映射对应的many属性。


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值