//建立类客户Customer与订单Order一对多的关系
public class Customer {
private Integer id;
// private String name;
private Integer age;
private Date birthday;
private boolean married;
private byte[] photo;
private String description;
/* 姓 */
private String fname ;
/* 名 */
private String lname ;
/* 建立从customer到Order的一对多关联关系 */
private Set<Order> orders = new HashSet<Order>();
...........
}
//建立从类Order中的多对一的关联。
public class Order {
private Integer id;
private String orderNo;
private float price;
private Customer customer;
..........
}
Hibernate 映射文件:
Customer.hbm.xml中 关于一对多,设置了关于orders的级联,也就是保存Customer对象的时候,orders也一样更新保存到数据库中。
<set name=“orders” cascade=“save-update” >
<key column=“CUSTOMER_ID” />
<one-to-many class=“mypack.Order” />
</set>
Order.hbm.xml中 多对一:
<many-to-one name=“customer”
column=“CUSTOMER_ID”
class=“..Customer”
cascade=“save-update”
not-null=“true” />
Customer 与 order 双方都设置了级联,也就是更新随便哪一方,另一方Hibernate在数据库里都更新。
下面是在测试类中 插入数据:
Customer c = new Customer();
Order o = new Order();
o.setCustomer(c);
//c.getorders().add(o);
s.save(c);
s.save(o);
上面的注释处,平常的思维会想:注释处的语句不要也可以啊。反正映射文件里面都写了双向关联了,无论保存谁,Hibernate都会关联起来,把另一方也保存到数据库中。
注意 :这样 普通的情况是没什么问题,但是:Hibernate 主要是负责插入到数据库的。而目前Java代码的变量都保存在计算机内存,也就是说Hibernate把数据库里的Customer表里已经插入了order的资料,但是在计算机内存中Java 类Customer的set集合里面没有order的信息。这时候的set集合的size为0,但数据库里有order数据,也就造成了数据库和java代码内存中的数据不一致,这时候如果再写一个方法foo() { if( c.getOrders().size==0 ) ......; } ,这里就出事情了,这里if后的语句肯定会执行,这就造成了数据库中的数据 和内存中 Java代码的的数据不统一。所以为了代码的健壮性,安全性,一定不能忘记写上注释那局代码。
多对多的话,必须加inverse