2016-07-03 57 views
0

我試着更新實體HibernateTransactionManager來回滾事務

@Test 
@Transactional 
public void test(){ 
    ChatState chatState = chatStateDAO.read(1L); 
    chatState.setState(2); 
    chatStateDAO.update(chatState); 
    chatState.setState(2); 
} 

更新方法是調用Hibernate的Session的update()。下面是我在我的日誌

2016-07-03 17:36:28 TRACE SessionImpl:219 - Opened session at timestamp: 14675565886 
2016-07-03 17:36:28 TRACE SessionImpl:1493 - Setting flush mode to: ALWAYS 
2016-07-03 17:36:28 TRACE DefaultSaveOrUpdateEventListener:210 - Updating detached instance 
2016-07-03 17:36:28 TRACE DefaultSaveOrUpdateEventListener:275 - Updating [ru.jeak.telegram.model.ChatState#1] 
2016-07-03 17:36:28 TRACE DefaultSaveOrUpdateEventListener:322 - Updating [ru.jeak.telegram.model.ChatState#1] 
2016-07-03 17:36:28 TRACE MyHibernateTransactionManager:943 - Triggering beforeCompletion synchronization 
2016-07-03 17:36:28 DEBUG MyHibernateTransactionManager:851 - Initiating transaction rollback 
2016-07-03 17:36:28 DEBUG MyHibernateTransactionManager:597 - Rolling back Hibernate transaction on Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=ExecutableList{size=0} updates=ExecutableList{size=0} deletions=ExecutableList{size=0} orphanRemovals=ExecutableList{size=0} collectionCreations=ExecutableList{size=0} collectionRemovals=ExecutableList{size=0} collectionUpdates=ExecutableList{size=0} collectionQueuedOps=ExecutableList{size=0} unresolvedInsertDependencies=null])] 
2016-07-03 17:36:28 DEBUG TransactionImpl:86 - rolling back 
2016-07-03 17:36:28 TRACE AbstractLogicalConnectionImplementor:114 - Preparing to rollback transaction via JDBC Connection.rollback() 
2016-07-03 17:36:28 TRACE AbstractLogicalConnectionImplementor:117 - Transaction rolled-back via JDBC Connection.rollback() 
2016-07-03 17:36:28 TRACE AbstractLogicalConnectionImplementor:54 - LogicalConnection#afterTransaction 
2016-07-03 17:36:28 TRACE ResourceRegistryStandardImpl:286 - Releasing JDBC resources 

MyHibernateTransactionManager是默認HibernateTransactionManager。我不明白爲什麼這個事務回滾沒有任何錯誤信息或什麼?

+0

@JBNizet爲什麼不讓評論成爲答案?它對我有一個很好的答案。 – DiogoSantana

+1

@DiogoSantana你是對的。我經常以一個簡短的評論開始,但後來我覺得有必要詳細說明,我的評論最終成爲答案。不幸的是,OP似乎並不在意。 –

回答

1

您無需撥打update()即可使更改保持不變。管理實體的更改會自動保存。 update()用於將分離的實體附加到會話。您的實體已連接。

關於回滾,Spring在測試結束時測試automatically rollback,除非您告訴Spring不要這樣做。

+0

是的,那是對的。在我的情況下更新沒有奏效,因爲每個DAO操作正在開啓一個新的會話。 – flgdev