我正在为webapp编写测试用例,这需要我模拟控制器并验证来自URL命中的结果。但是,我收到错误“传递给持久化的分离实体”。然而,webapp是实时的,工作没有错误,这意味着我的测试存在问题。
我对hibernate使用以下测试上下文
<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>
上下文不适用于数据库中的表,它在使用persist更新对象时出现上述错误。表格模式简化如下
'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')
我已经在stackoverflow上尝试了其他答案,建议在持久化的对象中不能出现id,因为它导致hibernate相信该对象与数据库同步,但是将id留空仍然会产生相同的错误。使用merge而不是persist会出现错误,表示
“密钥'uq_code'的重复条目'M923'; SQL [不适用];约束[null]”
我尝试在每次点击后刷新会话
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 :(得分:0)
错误消息表明字段Code
在数据库中必须是唯一的,但您的测试用例试图保留重复项。您的测试用例重复使用相同的值,或者它正在尝试使用数据库中已存在的值。
Duplicate entry 'M923' for key 'uq_code'
'code' varchar(64) NOT NULL,