Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 休眠分离对象持久化_Spring_Hibernate_Mockmvc - Fatal编程技术网

Spring 休眠分离对象持久化

Spring 休眠分离对象持久化,spring,hibernate,mockmvc,Spring,Hibernate,Mockmvc,我正在为一个webapp编写测试用例,它要求我模拟控制器并验证URL点击的结果。然而,我得到的错误是“分离的实体传递给persist”。然而,webapp是实时的,没有错误,这意味着问题在于我的测试 我为hibernate使用以下测试上下文 <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hiberna

我正在为一个webapp编写测试用例,它要求我模拟控制器并验证URL点击的结果。然而,我得到的错误是“分离的实体传递给persist”。然而,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>
我在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,