Java Hibernate没有抛出异常(我认为应该)
HibernateJavadoc声明,如果已经存在Java Hibernate没有抛出异常(我认为应该),java,hibernate,Java,Hibernate,HibernateJavadoc声明,如果已经存在o的持久实例,则Session.update(Object o)将引发异常,对吗 If there is a persistent instance with the same identifier, an exception is thrown. 正如你所说,两次我尝试执行多个update()s,但Hibernate仍然对我很宽容 有人有预感为什么 EDIT:似乎只有当另一个等价对象(例如,email2与email具有相同ID时,它才会抛出。我
o
的持久实例,则Session.update(Object o)
将引发异常,对吗
If there is a persistent instance with the same identifier, an exception is thrown.
正如你所说,两次我尝试执行多个update()
s,但Hibernate仍然对我很宽容
有人有预感为什么
EDIT:似乎只有当另一个等价对象(例如,
email2
与email
具有相同ID时,它才会抛出。我猜文档有点草率。Hibernate中的更新不是SQL语言中的更新。Hibernate处理SQL更新
自动通过会话对象中的状态缓存
但它仅适用于当前会话中加载的实体。此方法,session.update(object)用于将另一层的对象附加到当前会话,以便跟踪并在结束时进行更新
对你来说,这只是个小问题。如果:
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
您可以在上阅读有关更新方法语义的更多信息。您可以尝试使用session.flush()吗?查看是否会引发异常(根据刷新模式,有时提交可能不会刷新数据)
尽管我会说,只有在对象更新超出当前会话范围时才会引发异常,比如说由并发客户端进行更新。没有错误,因为它与您正在更新的实例相同
如果会话中存在不同的持久实例,并且您尝试更新(),则会引发错误。我建议您始终坚持使用
EntityManager。merge
而不是Hibernateupdate
方法,update
非常混乱
我发现这个解释很清楚,我经常提到
与persist和save一样,update方法是“原始”的Hibernate
在添加合并方法之前很久就存在的方法。它的
语义在几个关键点上有所不同:
- 作用于传递的对象(返回类型为void);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
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!