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属性。