2016-03-09 101 views
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也無濟於事。這裏有什麼問題。

回答

0

錯誤消息說,字段Code在數據庫中必須是唯一的,但是您的測試用例試圖保留重複項。您的測試用例反覆使用相同的值,或者正在嘗試使用數據庫中已有的值。

Duplicate entry 'M923' for key 'uq_code' 

'code' varchar(64) NOT NULL, 
+0

但這是我得到的錯誤,如果我用合併(對象)替換persist(對象),我知道值不重複。這可能是我的會議? –

+0

那麼,如果它是分離的,你不能使用持久化,你必須使用合併。如果是合併,它不應該抱怨代碼值。也許是一個單獨的測試,以確保合併與獨特的密鑰一起工作?你是否在實體中聲明瞭唯一的密鑰? –

+0

嗨,是的,我確實,它的一個名爲「代碼」的字段。這可能是我的會話有問題嗎?我正在使用openSessionInViewFilter,是否有合併問題?另外,在調用合併插入後調用持續更新會導致任何問題 –