下面内容整理自《精通Hibernate》第二版
注:既然是双向关联。“一对多双向关联”和“多对一双向关联”是同一回事。
对象位于内存中,在内存中从一个对象导航到还有一个对象显然比到数据库中查询数据的速度快多了。可是复杂的关联关联也会给编程带来麻烦。因此类与类之间是建立单向关联还是双向关联要由业务需求决定。
假设软件应用有大量这种需求:
1、依据给定的客户。查询该客户的全部订单。
2、依据给定的订单,查询发出订单的客户。
依据以上需求。最好还是为Customer类和Order类建立一对多双向关联。在上篇文章中介绍了Hibernate怎样建立多对一的单向关联(Order类到Customer类的多对一关联),在此不再赘述。
添加Customer类到Order类的一对多关联。首先须要在Customer类中添加一个集合类型的orders属性:
<span style="font-size:18px;">/** 在定义orders集合属性时将它初始化为集合实现类的一个实例, *这能够提高程序的健壮性,避免应用程序訪问取值为null的orders集合的方法而抛出NullPointerException */ private Set orders = new HashSet(); public Set getOrders(){ return orders; } public void setOrders(Set orders){ this.orders = orders; }</span>
之后在Customer类的Hibernate映射文件里加入下面内容:
<span style="font-size:18px;"><set name="orders" cascade="save-update" > <key column="CUSTOMER_ID" /> <one-to-many class="mypack.Order"/> </set></span>
<set>元素包含下面属性。
name:设定待映射的持久化类的属性的名字,此处为Customer类的orders属性。
cascade:当取值为"save-update",表示级联保存和更新。
<key>子元素:设定父方在子放中的外键,此处为“CUSTOMER_ID”,表明ORDERS表通过外键CUSTOMER_ID參照CUSTOMER表。
<one-to-many>子元素:表明orders集合中存放的是一组Order对象。
假设希望Hibernate删除Customer对象时,自己主动删除和Customer关联的Order对象,能够把cascade属性设为“delete”。
假设希望Hibernate自己主动删除不再和Customer对象关联的Order对象。能够把cascade属性设为“all-delete-orphan”。