繁体   English   中英

Hibernate 3:乐观锁定单元测试

[英]Hibernate 3 : optimistic locking unit test

我正在尝试测试我的应用程序的乐观锁定实现。 但是结果不是我期望的。 我要测试的步骤如下

  • 从数据库加载实体
  • 将版本属性设置为比数据库中当前版本少一
  • 改变另一个只是字符串的属性
  • 保存实体

我现在期望一个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;
}

这是我的sessionfactory的配置

<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的配置上有什么遗漏的吗,还是完全错误地对其进行了测试,应该以其他方式对其进行测试吗?

提前致谢

对版本字段进行回归是危险的,因为它是受Hibernate控制的(如果您使用的是JPA版本控制功能)。 加载实体,分离实体(可能使用session.evict(obj)),更改属性。 加载到同一实体中,使其保持附着状态,对其进行更改,然后保存。 重新附加第一个实体并尝试保存它(我认为Merge会这样做)。 然后,您应该看到StaleObjectStateException异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM