2016-03-09 66 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,是否有合并问题?另外,在调用合并插入后调用持续更新会导致任何问题 –