Spring 休眠分离对象持久化
我正在为一个webapp编写测试用例,它要求我模拟控制器并验证URL点击的结果。然而,我得到的错误是“分离的实体传递给persist”。然而,webapp是实时的,没有错误,这意味着问题在于我的测试 我为hibernate使用以下测试上下文Spring 休眠分离对象持久化,spring,hibernate,mockmvc,Spring,Hibernate,Mockmvc,我正在为一个webapp编写测试用例,它要求我模拟控制器并验证URL点击的结果。然而,我得到的错误是“分离的实体传递给persist”。然而,webapp是实时的,没有错误,这意味着问题在于我的测试 我为hibernate使用以下测试上下文 <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hiberna
<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>
我在stackoverflow上尝试了其他答案,建议id不能出现在被持久化的对象中,因为这会使hibernate相信该对象与数据库同步,但将id保留为空仍然会产生相同的错误。使用merge而不是persist会产生一个错误
“键'uq_code';SQL[n/a];约束[null]的重复条目'M923'”
每次点击URL后,我都会尝试刷新会话
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也无济于事。这里的问题是什么。错误消息说字段
代码在数据库中必须是唯一的,但是您的测试用例正在尝试保留重复项。您的测试用例重复使用相同的值,或者试图使用数据库中已有的值
Duplicate entry 'M923' for key 'uq_code'
'code' varchar(64) NOT NULL,
但如果我将persist(object)替换为merge(object),并且我知道这些值不会重复,那么这就是我得到的错误。这可能与我的会话有关吗?好吧,如果它被分离,你不能使用persist,你必须使用merge。如果是合并,则不应抱怨代码值。也许需要一个单独的测试来确保合并使用唯一的密钥工作?您是否在实体中声明了唯一密钥?您好,是的,我声明了,它是一个名为“code”的字段。这可能是我的课程有问题吗?我使用的是openSessionInViewFilter,合并有问题吗?另外,调用merge to insert后调用persist to update是否会导致任何问题?我不知道这两个帐户是否都存在问题,我只是在应该执行合并时不会使用persist。
Duplicate entry 'M923' for key 'uq_code'
'code' varchar(64) NOT NULL,