前提条件:数据库的表中,存在id号为57和59的记录的存在。做如下操作:public void testDelete2() {
  try {
session = HibernateSessionFactory.getSession();
tx = session.getTransaction();
tx.begin();
 
User user2 = null;
user2 = (User) session.load(User.class, 57);
session.delete(user2);  user2.setId(59); 
           //  这里,指定的id=59,是数据库中已经存在的一个编号,
           // 请问:此时,重新指定一个已经存在的记录的id,此时的user2对象是 什么状态呢?
user2.setUsername("赵云"); session.update(user2);
           //这种update方法,没有对数据库产生任何影响。
           //这种save方法,会把 "赵云" 的人,插入数据库的表中。 tx.commit();
 } catch (HibernateException e) {
if (tx.isActive()) {
tx.rollback();
           }
  e.printStackTrace();
 } finally {
HibernateSessionFactory.closeSession(session);
} } 上面的例子中,当我使用session.update(user2);时,没有对数据库产生任何影响;当我使用session.save(user2);的时候,发现新纪录插入到数据库中去了。请问:程序中的user2.setId(59); 之后,user2这个对象,是什么状态呢?

解决方案 »

  1.   

    那要看映射配置了,如果id配成数据库自增主键的话,不能setId
      

  2.   

    此时是游离态的,所以你设置不管用.它 与数据库不对应,
    应该先加载ID为59的,才可更新.
    脱管与游离的区别,在于是否有DB记录相关.脱管是有的.而游离态是没有的.不能通过UPDATE再关联到SESSION
      

  3.   

    是游离状态的 
    在user2.setId(59)之后,
    如果你的数据库里存放的 id=59的数据项 并且在映射表里配置的lazy="true"时,
    要用user2 = session.get(User.class,59) 来使user2变成持久状态的(也就是说对象和数据库统一)
    再执行user2.setUsername("赵云")  然后再用update语句进行更新。 
    如果lazy="false"时,上面的get可以改为load来加载对象。使其持久化。关于lazy 你可以再网上做相关的查阅
      

  4.   


    我不知道你说的游离是什么 不过 我记得帮助文档的时候有三种状态 瞬间 持久 脱管 瞬间没有持久标识 而持久和脱管有 而脱管又脱离SESSION的管治(与持久对象的SESSION被关闭之后的对象就成为了脱管) 你的对象丧失了持久化标识 又重新有了持久化标识 你想让他后期成为脱管 但是他不是 他应该是瞬间