EntityManager.flush()不刷新(JPA2(OpenJPA),EJB3,Spring3,Websphere 7)

时间:2013-06-26 18:44:32

标签: spring jpa-2.0 ejb-3.0 openjpa websphere-7

我在我的项目中遇到一个问题:entityManager.flush()没有做任何事情,并且只在提交之前,退出EJB时才进行刷新。

我的项目在WebSphere 7上运行。 我正在使用JPA2到OpenJPA。 我正在使用Spring进行自动装配。 我正在使用Container Managed Transactions。

下面的相关代码段

的persistence.xml

<persistence-unit name="persistenceUnit" transaction-type="JTA">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <properties>
        <property name="openjpa.TransactionMode" value="managed" />
        <property name="openjpa.ConnectionFactoryMode" value="managed" />
        <property name="openjpa.DynamicEnhancementAgent" value="true" />
    <property name="openjpa.jdbc.DBDictionary" value="StoreCharsAsNumbers=false" />
        <property name="openjpa.Log" value="SQL=TRACE"/>
    </properties>
</persistence-unit>

的applicationContext.xml

<!-- Configure a JPA vendor adapter -->
<bean id="openJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter">
    <property name="showSql" value="true" />
    <property name="generateDdl" value="false" />
</bean>

<!-- Entity Manager -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/myappDS"/>
</bean>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
    <property name="persistenceUnitName" value="persistenceUnit"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter" ref="openJpaVendorAdapter" />
</bean>

EJB3 Bean

@Stateless(name="JPABaseEntityServiceBean")
@Configurable
public class JPABaseEntityServiceBean implements JPABaseEntityService {

    Logger logger = LoggerFactory.getLogger(JPABaseEntityServiceBean.class);

    @Autowired
    JPABaseEntityDao jpaBaseEntityDao;

    public JPABaseEntity persist(JPABaseEntity jpaBaseEntity) {
        return jpaBaseEntityDao.persist(jpaBaseEntity);
    }

DAO:

@Repository
public class JPABaseEntityDao implements BaseEntityDao {

    @PersistenceContext
    transient EntityManager entityManager;

    public JPABaseEntity persist(JPABaseEntity jpaBaseEntity) {
        Date now = new Date();
        jpaBaseEntity.setCreatedBy(TO_DO_ME);
        jpaBaseEntity.setUpdatedBy(TO_DO_ME);
        jpaBaseEntity.setUpdatedOn(now);
        jpaBaseEntity.setCreatedOn(now);

        entityManager.persist(jpaBaseEntity);

        entityManager.flush();

        return jpaBaseEntity;
    }

只有在离开EJB时才会执行“INSERT”,这意味着DAO中的entityManager.flush()无法正常工作

1 个答案:

答案 0 :(得分:1)

好的,以某种方式解决了

似乎问题是实体管理器没有从WebSphere获得事务(可能是因为实体管理器是由Spring注入的,我没有深入调查过)

所以我做的是让Spring控制EntityManager中的事务:

1. added <tx:annotation-driven/> and <tx:jta-transaction-manager/> to applicationContext.xml
2. annotated the DAO methods with @Transactional

整个事务仍然由EJB处理,这意味着它仍在使用来自WebSphere的CMT和JTA

我有很多问题因为依赖地狱(让我最多的是hibernate-core,包括JBoss的javax.transaction实现,grr),但除此之外,一切似乎都在顺利进行