[英]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
將被刪除。
那么如何解決呢?
iObject
的數量。 第二個將刪除數量為零的所有實體。 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.