开发者

Spring @Transactional - JPA context in transaction problem

开发者 https://www.devze.com 2023-02-19 07:45 出处:网络
I\'m using Spring + JSF + JPA configuration hosted on Glassfish v3.1. I\'m experiencing some strange (at least for me) behavior of @Transactional annotation. Here is my simplified example:

I'm using Spring + JSF + JPA configuration hosted on Glassfish v3.1. I'm experiencing some strange (at least for me) behavior of @Transactional annotation. Here is my simplified example:

@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);
    }
}

It turns out that "associateGroupToRole" with Entities as arguments works correctly and the one with String - does not. After small modification and coping code from one method to another:

@Transactional
public void associateGroupToRole(String role, String group) throws MyServiceException {
    GroupEntity groupEntity   = userDao.getGroupByName(group开发者_如何学Python);
    RoleEntity roleEntity     = userDao.getRoleByName(role);

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

The code runs without any problems and everything is committed to database. My question is: What might be wrong in above example, what is happening to transaction context (when accessing from one annotated method to another), and why my entities are no longer in managed state?

Here is my Spring configuration:

<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/>

As you can see I'm using persistence.xml file and my EntityManager uses JNDI to connect to DB.


Unfortunately there was a bug in some other piece of DAO code. Please vote for close this question.

0

精彩评论

暂无评论...
验证码 换一张
取 消