簡體   English   中英

Java Hibernate會話刪除對象

[英]Java Hibernate session delete of object

我真的在休眠會話中苦苦掙扎,在對修改后的會話對象進行查詢時,我從未獲得預期的結果。 我認為我所有的問題都有關。 最后一個是以下內容:

final Session iSession = AbstractDAO.getSessionFactory().openSession();
try {
    iSession.beginTransaction();
    MyObject iObject = DAOMyObject.getInstance().get(iSession,ObjectId);
    iObject.setQuantity(0); //previously the quantity was different from zero
    DAOMyObject.getInstance().update(iSession,iObject);
    DAOMyObject.getInstance().deleteObjectWithZeroQuantities(iSession);
    iSession.getTransaction().commit();
} catch (final Exception aException) {
    iSession.getTransaction().rollback();
    logger.error(aException.getMessage(), aException);
    throw aException;
} finally {
    iSession.close();
}

我沒有得到的是為什么不刪除對象,因為我在會話中對其進行了修改,所以進行刪除的查詢應該可以找到它。 我在創建一個會話中具有增量ID的對象,然后在提交之前在同一會話中使用select max(id)+1創建另一個對象時遇到了同樣的問題。 但是每次會話都會為我獲取相同數量的ID。

我的猜測是,在DAOMyObject.getInstance().deleteObjectWithZeroQuantities(iSession)您將進行查詢以訪問數據庫 但是,在數據庫中,您的iObject.getQuantity()仍然為!=0 ,因此不會將其刪除。

為什么您的查詢命中數據庫而不是使用Session緩存的iObject實例?

這是因為查詢必須檢索quantity != 0 所有實體 ,並且您沒有緩存所有實體 Session的第一級緩存通常在按ID檢索實體時使用,查詢形式為select * from MyEntity where id=123456 在查詢的where子句中添加其他條件將迫使Hibernate命中數據庫。

請注意,無論條件是select查詢的一部分還是update / delete一部分,都會發生同樣的情況。 Hibernate仍然必須命中數據庫,並且iObject將被刪除。

那么如何解決呢?

  1. 進行兩次交易。 第一個將更改iObject的數量。 第二個將刪除數量為零的所有實體。
  2. 如果必須在同一事務中進行兩項操作,則只需在刪除所有其他零數量實體之前/之后顯式刪除iObject 請記住,您知道它的ID。

1 ,即使您這樣做,Hibernate也無法知道它,因為其他一些Session可能剛剛插入了查詢也應選擇的新實體

編輯:

另一個選擇是session.flush()更改iObject的數量...實際上,我認為是問題所在。 DAOMyObject.getInstance().update(iSession,iObject) ,更改數量並調用iSession.save() ,應調用iSession.flush() 這會將更改寫入數據庫,以便隨后遇到該更改的查詢可以看到該更改。 這是正確的方法。

您必須執行session.flush()

您的對象更改僅在內存中,並且只有在刷新之前它們才會在數據庫中持久存在。 另外,您可以將FlushMode設置為COMMIT ,並且每次提交也將刷新。 我建議每次都手動沖洗。

暫無
暫無

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

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