0
我正在寫一個webapp的測試用例,它需要我模擬控制器並驗證來自URL命中的結果。但是,我收到錯誤「分離的實體通過堅持」。然而,webapp是活的而且沒有錯誤,這意味着問題出在我的測試上。冬眠分離對象持久
我使用下面的測試上下文冬眠
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="org.hibernate.envers.audit_table_prefix">history_</prop>
<prop key="org.hibernate.envers.audit_table_suffix"></prop>
<prop key="org.hibernate.envers.revision_type_field_name">_REV_TYPE</prop>
<prop key="org.hibernate.envers.revision_on_collection_change">false</prop>
<prop key="hibernate.enable_lazy_load_no_trans">true</prop>
</props>
</property>
上下文在數據庫中的表不工作,其中它提供了關於更新堅持用對象上述錯誤。簡化的表結構如下所示
'id' int(11) NOT NULL AUTO_INCREMENT,
'code' varchar(64) NOT NULL,
'num_added' int(11) NOT NULL DEFAULT '0',
'created' datetime NOT NULL,
'updates' datetime NOT NULL,
PRIMARY KEY('id'),
UNIQUE KEY 'uq_code' ('code')
我曾嘗試在計算器提示標識不能存在於物體其他的答案被持久化,因爲它導致休眠到相信的那個對象與數據庫同步,但是留下ID空仍然給出相同的錯誤。使用合併,而不是堅持給,說
錯誤「關鍵‘uq_code’重複條目‘M923’; SQL [N/A];約束[空]」
我都試過後,每刷新會議網址命中像這樣
private void refresh(){
if(openSessionInViewFilter!=null){
openSessionInViewFilter.destroy();
openSessionInViewFilter = new OpenSessionInViewFilter();
openSessionInViewFilter.setServletContext(servletContext);
openSessionInViewFilter.setSessionFactoryBeanName("sessionFactory");
this.controller = MockMvcBuilders.standaloneSetup(Controller).addFilters(openSessionInViewFilter).build();
}
}
但錯誤保持不變。同樣,將會話參數singleSession和hibernate.transaction.auto_close_session設置爲true/false也無濟於事。這裏有什麼問題。
但這是我得到的錯誤,如果我用合併(對象)替換persist(對象),我知道值不重複。這可能是我的會議? –
那麼,如果它是分離的,你不能使用持久化,你必須使用合併。如果是合併,它不應該抱怨代碼值。也許是一個單獨的測試,以確保合併與獨特的密鑰一起工作?你是否在實體中聲明瞭唯一的密鑰? –
嗨,是的,我確實,它的一個名爲「代碼」的字段。這可能是我的會話有問題嗎?我正在使用openSessionInViewFilter,是否有合併問題?另外,在調用合併插入後調用持續更新會導致任何問題 –