簡體   English   中英

Hibernate 合並和刷新不會持久更改對象

[英]Hibernate merge and flush do not persist changes to an object

這是一個關於更新數據庫中對象的 Hibernate/JPA 問題。

我有一個使用 entityManager.persist(object) 在另一個事務中創建的對象。

返回此對象,然后更新一些值。 然后在另一個用@Transactional 注釋的方法中進行調用。 此方法調用基類中的合並方法(如下所示)。

在下面的代碼中,右值具有修改后的信息,直到調用 refresh 。 調用刷新后,數據將恢復為原始值。

我希望對 flush() 的調用會將信息保存到數據庫中。

我嘗試注釋掉刷新調用,認為在我將方法包裝在事務中之前不會發生保存。 但是,我仍然發現這些變化沒有被持久化。

任何關於可能發生的事情的想法將不勝感激!

@Override
public T merge(T object) {
    T rvalue = entityManager.merge(object);
    entityManager.flush();
    entityManager.refresh(rvalue);
    return rvalue;
}

我想出了問題所在。 事實證明,問題與 entityManager 或 @Transaction 設置無關。 那是實體。 我試圖更新的字段之一被標記為可更新=假。 一旦我找到並更改了該參數,一切都很好。 我習慣於在定義它的 getter 上的 @Column 注釋上看到此設置,但發現它被派生類中的 @AttributeOverride 注釋覆蓋。

雖然事實證明這是一個簡單而簡單的原因和解決方法,但通往那里的道路有其問題。 在我所有的故障排除(單步執行代碼,打開 Hibernate 和 Spring 的日志等)中,我沒有遇到任何由於此約束而導致更新失敗的異常。

合並創建實體的新實例,從提供的實體復制狀態,並管理新副本。 您傳入的實例將不會被管理(您所做的任何更改都不會成為事務的一部分 - 除非您再次調用合並)。

來源在這里

我遇到這個問題是因為我調用了 session.setDefaultReadOnly(true); 在休眠會話上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM