Hibernate是*NOT*抛出异常(我认为它应该)

And*_*lla 7 java hibernate

Hibernate JavaDoc声明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! :(
Run Code Online (Sandbox Code Playgroud)

正如你可以说,两次我尝试做多update()S,但仍Hibernate的对我采取容易.

有谁有预感为什么?

编辑:它似乎只会抛出另一个等效对象,例如,email2具有相同的ID email.我想文档有点草率.

Art*_*rov 8

在SQL语言中,Hibernate中的更新不是UPDATE.Hibernate 通过Session对象中的状态缓存自动处理SQL UPDATE .

但它仅适用于当前会话中加载的实体.此方法,session.update(object)用于将对象从另一个层附加到当前会话以跟踪并最终可能更新.

在你的情况下,它只是一个NOOP.如果:

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
Run Code Online (Sandbox Code Playgroud)

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


Dar*_*uid 6

没有错误,因为它与您正在更新的实例相同.

如果会话中存在DIFFERENT持久性实例并且您尝试更新(),则会引发错误.