Spring @Transactional - 交易问题中的JPA上下文

时间:2011-03-24 18:59:42

标签: spring jpa transactions jta

我正在使用Glassfish v3.1上托管的Spring + JSF + JPA配置。 我遇到了@Transactional注释的一些奇怪的行为(至少对我而言)。这是我的简化示例:

@Transactional
public void associateGroupToRole(String role, String group) throws MyServiceException {
    GroupEntity groupEntity   = userDao.getGroupByName(group);
    RoleEntity roleEntity     = userDao.getRoleByName(role);
    //some stuff
    if(!roleEntity.getGroups().contains(groupEntity)) {
        roleEntity.getGroups().add(groupEntity);
    }
}

@Transactional
public void associateGroupToRole(RoleEntity roleEntity, GroupEntity groupEntity) throws MyServiceException {
    //some stuff
    if(!roleEntity.getGroups().contains(groupEntity)) {
        roleEntity.getGroups().add(groupEntity);
    }
}

事实证明,“associateGroupToRole”与实体作为参数正常工作,而带有String的那个 - 没有。经过小修改和从一种方法到另一种方法的应对代码:

@Transactional
public void associateGroupToRole(String role, String group) throws MyServiceException {
    GroupEntity groupEntity   = userDao.getGroupByName(group);
    RoleEntity roleEntity     = userDao.getRoleByName(role);

    if(!roleEntity.getGroups().contains(groupEntity)) {
        roleEntity.getGroups().add(groupEntity);
    }
}

代码运行没有任何问题,一切都提交到数据库。我的问题是:在上面的示例中可能出现什么问题,事务上下文发生了什么(从一个带注释的方法访问另一个时),以及为什么我的实体不再处于托管状态?

这是我的Spring配置:

<context:annotation-config />
<context:component-scan base-package="com.mypackage"/>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
    </property>
</bean>

<tx:jta-transaction-manager/>
<tx:annotation-driven/>

如您所见,我正在使用persistence.xml文件,而我的EntityManager使用JNDI连接到DB。

1 个答案:

答案 0 :(得分:0)

不幸的是,其他一些DAO代码中存在一个错误。请投票支持关闭这个问题。