Java中关于u aved-value的问题

文章作者 100test 发表时间 2007:12:01 14:28:27
来源 100Test.Com百考试题网


unsaved-value是表示一个对象是新的还是旧的,如果unsaved-value=none 那么就是新的,就会被insert到数据库中,如果unsaved-value=any 就是说明对象是从数据库中load的,被0update到数据库中。
  
  我的问题是:unsaved-value是由我们来强制说明这个对象是新的还是旧的,那如果我把一个对象的unsaved-value设置为any,那我要new 一个对象,把他save到数据库中,怎么做呢?我感觉这不是矛盾了吗?主要是我们在写配置文件的时候怎么能说一个对象就一定是new的还是load的?
  
  当你显式的使用session.save()或者session.0update()操作一个对象的时候,实际上是用不到unsaved-value的。某些情况下(父子表关联保存),当你在程序中并没有显式的使用save或者0update一个持久对象,那么Hibernate需要判断被操作的对象究竟是一个已经持久化过的持久对象,是一个尚未被持久化过的内存临时对象。例如:
  
  代码:
  Session session = ....
  Transaction tx = ....
  
  Parent parent = (Parent) session.load(Parent.class, id).
  
  Child child = new Child().
  child.setParent(parent).
  child.setName("sun").
  
  parent.addChild(child).
  s.0update(parent).
  
  s.flush().
  tx.commit().
  s.close().
  
  
  在上例中,程序并没有显式的session.save(child). 那么Hibernate需要知道child究竟是一个临时对象,还是已经在数据库中有的持久对象。如果child是一个新创建的临时对象(本例中就是这种情况),那么Hibernate应该自动产生session.save(child)这样的操作,如果child是已经在数据库中有的持久对象,那么Hibernate应该自动产生session.0update(child)这样的操作。
  
  因此我们需要暗示一下Hibernate,究竟child对象应该对它自动save还是0update。在上例中,显然我们应该暗示Hibernate对child自动save,而不是自动0update。那么Hibernate如何判断究竟对child是save还是0update呢?它会取一下child的主键属性 child.getId() ,这里假设id是 java.lang.Integer类型的。如果取到的Id值和hbm映射文件中指定的unsave-value相等,那么Hibernate认为child是新的内存临时对象,发送save,如果不相等,那么Hibernate认为child是已经持久过的对象,发送0update。
  
  unsaved-value="null" (默认情况,适用于大多数对象类型主键 Integer/Long/String/...)
  
  当Hibernate取一下child的Id,取出来的是null(在上例中肯定取出来的是null),和unsaved-value设定值相等,发送save(child)
  
  当Hibernate取一下child的id,取出来的不是null,那么和unsaved-value设定值不相等,发送0update(child)
  
  例如下面的情况:
  
  代码:
  Session session = ....
  Transaction tx = ....
  
  Parent parent = (Parent) session.load(Parent.class, id).
  Child child = (Child) session.load(Child.class, childId).
  
  child.setParent(parent).
  child.setName("sun").
  
  parent.addChild(child).
  s.0update(parent).
  
  s.flush().
  tx.commit().
  s.close().

相关文章


Oracle将加强代码基地安全防御力度
CERN应用Oracle9iAS提高网络应用性能
轻松建立Linux拨号服务
为什么不能配置邮件服务器为openrelay的
Java中关于u aved-value的问题
Java的秘密:将应用程序的设定存在哪里
为什么用“==”与“equal”得到的输出不同
优秀的对象角色建模解决方案-Torque
国庆考研复习:英语多做模拟专业课稳扎稳打
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛