0

コントローラーをモックし、URL ヒットの結果を検証する必要がある Web アプリケーションのテスト ケースを作成しています。ただし、「分離されたエンティティが永続化されました」というエラーが表示されます。ただし、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が存在してはならないことを示唆していますが、IDを空のままにすると同じエラーが発生します。永続化の代わりにマージを使用すると、次のエラーが表示されます

「キー 'uq_code' の重複エントリ 'M923' ; SQL [該当なし]; 制約 [null]」

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 に変更しても効果はありません。ここでの問題は何ですか。

4

1 に答える 1

0

エラー メッセージは、フィールドCodeがデータベース内で一意である必要があることを示していますが、テスト ケースは重複を保持しようとしています。テスト ケースが同じ値を繰り返し使用しているか、データベースに既にある値を使用しようとしています。

Duplicate entry 'M923' for key 'uq_code' 

'code' varchar(64) NOT NULL,
于 2016-03-09T14:57:28.310 に答える