1

我正在运行一个小型 spring3/Hibernate JPA 应用程序,并且在尝试使用事务注释时遇到了麻烦。基本上它们被 TransactionManager 忽略。

我已经修改了一个保存方法,以突出显示 Transactional 属性 readOnly 被忽略。基本上我会认为persist调用会导致抛出异常,因为readOnly属性设置为true,但事实并非如此,实体愉快地持久保存到内存中的HSQLDB。

@Transactional(readOnly=true)
public Product save(Product product) throws HibernateException {

    getEntityManager().persist(product);

    return product;
}

JPATransaction 管理器的连接方式如下...

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:mem:testdb;shutdown=false" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" id="jpaProperties">
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="searchSystemEnvironment" value="true" />
    <property name="location" value="classpath:landingPage-hibernate.properties"/>
</bean>

<util:properties id="jpaHibernateProperties">
    <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
    <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>
    <prop key="hibernate.cache.use_query_cache">true</prop>
    <prop key="hibernate.cache.use_second_level_cache">true</prop>
</util:properties>

<bean id="hibernateVendor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
    <property name="databasePlatform" value="${hibernate.dialect}"/> 
    <property name="showSql" value="${hibernate.show_sql}" />
    <property name="generateDdl" value="${generateDdl}"/>
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="landingPagePersistence"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter" ref="hibernateVendor"/>
    <property name="jpaPropertyMap" ref="jpaHibernateProperties"/>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

有人会有使用事务属性的 JPATransactionManager 的示例,还是我完全误解了 JPA 的用法?我可以在 EntityManager 构造函数中看到 PersistenceContext 始终是 EXTENDED 而不是 TRANSACTION 似乎与是否考虑注释有关。任何帮助将不胜感激。

谢谢,马克。

4

1 回答 1

1

这不是一个错误。这是记录在案的预期行为:

这只是作为实际事务子系统的提示;它不一定会导致写访问尝试失败。无法解释只读提示的事务管理器在请求只读事务时不会抛出异常。

于 2013-05-16T12:39:58.660 回答