コントローラーをモックし、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 に変更しても効果はありません。ここでの問題は何ですか。