数据的一致性,关于双向(Hibernate)

//建立类客户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

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值