Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate没有抛出异常(我认为应该)_Java_Hibernate - Fatal编程技术网

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

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时,它才会抛出。我

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时,它才会抛出。我猜文档有点草率。

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
而不是Hibernate
update
方法,
update
非常混乱

我发现这个解释很清楚,我经常提到

与persist和save一样,update方法是“原始”的Hibernate 在添加合并方法之前很久就存在的方法。它的 语义在几个关键点上有所不同:

  • 作用于传递的对象(返回类型为void);update方法将传递的对象从分离转换为持久
    国家
  • 如果将一个临时实体传递给该方法,则该方法将引发异常
在下面的示例中,我们保存对象,然后将其逐出(分离) 从上下文中,然后更改其名称并调用update。注意,我们 不要将更新操作的结果放在单独的变量中, 因为更新发生在person对象本身上。基本上 我们正在将现有实体实例重新附加到持久性 上下文-JPA规范不允许我们做的事情

尝试在临时实例上调用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!