1

アプリケーションの楽観的ロックの実装をテストしようとしています。しかし、結果は私が期待するものではありません。テストする手順は次のとおりです

  • データベースからエンティティをロードする
  • version 属性を、データベースに存在する値よりも 1 小さい値に設定します
  • 文字列だけの別の属性を別のものに変更する
  • エンティティを保存する

今は staleException が発生すると予想していましたが、エンティティが保存されるだけで、バージョンが次の行に増えます。

ここに私の保存コードの小さな抜粋があります

   public <T extends DomainObject> T save(T objectToSave) {
        Session currentSession = null;
        try {
            currentSession = sessionFactory.getCurrentSession();
            currentSession.save(objectToSave);
            return objectToSave;
        } catch (Exception ex) {
            logger.error("save error",ex);
        }
        return null;
    }

次のコードを使用して、アプリケーション全体から名前付きクエリを使用して ID でオブジェクトをロードします

@SuppressWarnings("unchecked")
public <T extends Object> List<T> query(Class<T> returnClass, String query, List<String> namedParams, List<? extends Object> params, Integer limit) {
    Session currentSession = null;
    try {
        currentSession = sessionFactory.getCurrentSession();
        Query namedQuery = currentSession.getNamedQuery(query);
        if(limit != null){
            namedQuery.setMaxResults(limit);
        }
        namedQuery.setCacheable(true);
        if (namedParams != null && namedParams.size() > 0) {
            addParams(namedQuery, namedParams, (List<Object>) params);
        }
        return namedQuery.list();
    } catch (Exception ex) {
        logger.error("query error",ex);
    }
    return null;
}

そして、これは私のセッションファクトリーの構成です

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="entityInterceptor" ref="auditInterceptor" />
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <value>
            hibernate.dialect=${hibernate.dialect}
            hibernate.show_sql=${hibernate.show_sql}
            hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
            hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.EhCacheRegionFactory
            hibernate.cache.use_query_cache=true
            hibernate.cache.use_second_level_cache=true
            hibernate.cache.provider_configuration_file_resource_path=ehcache.xml
            hibernate.generate_statistics=true
            hbm2ddl.auto=${hbm2ddl.auto}
            hibernate.c3p0.min_size=${hibernate.c3p0.min_size}
            hibernate.c3p0.max_size=${hibernate.c3p0.max_size}
            hibernate.c3p0.timeout=${hibernate.c3p0.timeout}
            hibernate.c3p0.max_statements=${hibernate.c3p0.max_statements}
            hibernate.c3p0.idle_test_period=${hibernate.c3p0.idle_test_period}
        </value>
    </property>
    <property name="schemaUpdate">
        <value>true</value>
    </property>
    <property name="annotatedClasses">
        <list>
            <value>com.mbalogos.mba.domain.site.Site</value>
        </list>
    </property>
</bean>          

sessionFactory の構成で見逃したものはありますか、それとも完全に間違ってテストしていますか?別の方法でテストする必要がありますか?

前もって感謝します

4

1 に答える 1

1

Hibernate で制御されているため、バージョン フィールドを後退させることは危険です (JPA バージョニング機能を使用している場合)。エンティティをロードし、切り離し (おそらく session.evict(obj) を使用)、属性を変更します。同じエンティティをロードし、アタッチしたままにし、変更して保存します。最初のエンティティを再接続し、保存を試みます (Merge がこれを行うと思います)。その後、StaleObjectStateException 例外が表示されます。

于 2012-10-24T08:40:34.123 に答える