代码之家  ›  专栏  ›  技术社区  ›  André Chalella

Hibernate没有抛出异常(我认为应该)

  •  6
  • André Chalella  · 技术社区  · 16 年前

    Session.update(Object o) 如果已经存在 o

    If there is a persistent instance with the same identifier, an exception is thrown.

    但是,以下代码在我运行时不会抛出任何内容。我觉得应该!

    Email email = new Email("andre", "girafa", "hi");
    
    Session session = factory.openSession();
    Transaction tx = session.beginTransaction();
    
    session.save(email);
    session.update(email);
    session.update(email);
    
    tx.commit();
    
    // didn't throw... Let's try again
    
    tx = session.beginTransaction();
    
    session.update(email);
    session.update(email);
    
    tx.commit();
    session.close();
    
    // still nothing! :(
    

    正如你所说, 我试着做多个 update() s、 但冬眠还是让我放松。

    有人有预感为什么?

    编辑: 另一个等价对象 ,例如, email2 email . 我想那里的文件有点草率。

    4 回复  |  直到 16 年前
        1
  •  8
  •   Brandon    16 年前

    Hibernate中的更新不是SQL语言中的更新。Hibernate处理SQL更新 通过会话对象中的状态缓存。

    session.update(对象) 用于将对象从另一层附加到当前会话,以便在最后跟踪和(可能的)更新。

    对你来说这只是个小问题。如果:

    Email email = new Email("andre", "girafa", "hi");
    
    Session session = factory.openSession();
    Transaction tx = session.beginTransaction();
    
    int id = session.save(email);
    Email anotherEmail = new Email("", "", "");
    anotherEmail.id = id;
    
    session.update(anotherEmail);    // will throw
    

    您可以在上阅读有关更新方法语义的更多信息 Hibernate reference .

        2
  •  6
  •   DarkSquid    16 年前

    没有错误,因为它是您正在更新的同一个实例。

        3
  •  0
  •   Pere Villega    16 年前

    你能试试session.flush()吗?查看是否引发异常(有时提交可能不刷新数据,具体取决于刷新模式)。

    尽管我会说,只有当对象在当前会话的作用域之外更新时才会引发异常,例如由并发客户机进行更新。

        4
  •  0
  •   Sam YC    6 年前

    EntityManager.merge 而不是冬眠 update 方法, 更新 很混乱。

    我找到这个了 article 解释清楚我经常提到的。

    在添加合并方法之前很久就存在的方法。它的 语义在几个关键点上有所不同:


    • 国家;
    • 如果传递一个临时实体,此方法将引发异常。

    从上下文中,然后更改其名称并调用update。注意我们 不要将更新操作的结果放在单独的变量中, 因为更新发生在person对象本身上。基本上 正在将现有实体实例重新附加到持久性 上下文JPA规范不允许我们做的事情。

    Person person = new Person();
    person.setName("John");
    session.save(person);
    session.evict(person);
    
    person.setName("Mary");
    session.update(person);
    

    例外。以下操作不起作用:

    Person person = new Person();
    person.setName("John");
    session.update(person); // PersistenceException!
    

    为了理解上面的部分,您需要理解 transient detached 反对。