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