【问题标题】:Data is not getting inserted in JPA Spring weblogic数据未插入 JPA Spring weblogic 中
【发布时间】:2016-09-04 22:37:17
【问题描述】:

我在应用程序上下文中有以下配置

<jee:jndi-lookup id="dataSource" jndi-name="MY_DS" />
<context:load-time-weaver/>
<bean id="transactionManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />


<bean id="emf"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jtaDataSource" ref="dataSource" />
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
    <property name="persistenceUnitName" value="pu_TEST" />
</bean>
<bean id="jpaVendorAdapter"
    class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
    <property name="database" value="ORACLE" />
    <property name="showSql" value="true" />
</bean>

现在是我的 DAO 课程

@Repository
public class EmployeeDAO{

    @PersistenceContext
    private EntityManager em;
    @Transactional
    public void create(Employee entity) {
        LOG.error("Enitity Manager:create" + em);
        em.persist(entity);
        // em.flush(); if i use flush it saves
    } 
}

现在,当我保存实体时,它没有说给出任何错误,但没有数据更新到数据库中。 我不希望使用刷新,因为实体管理器是由弹簧注入的,并且应该在最后自动执行刷新,这不会发生。纠正我的理解。

添加外观类可能存在问题,Propagation.REQUIRES_NEW 有什么关系吗?

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void process(){
    Employee e = factory.getEmployee();
    employeeDao.create(e);
}

在创建方法调用后的调试中,它显示员工获得了填充的主键,这意味着已经进行了数据库调用,但最后它没有被持久化。

【问题讨论】:

  • 您使用的是哪个 Spring 版本?
  • 我使用的是 Spring 3.2
  • EntityManager 没有连接到您的事务管理器,因此没有注册为事务提交时的侦听器。正如下面的答案中提到的, em.joinTransaction() 会起作用,但它是一种解决方法,就像调用 em.flush 一样。您缺少传递给 TransactionManager 的 entityManagerFactory 属性,如此处所述stackoverflow.com/questions/10421829/… 或尝试设置目标服务器属性eclipse.org/eclipselink/documentation/2.4/jpa/extensions/…
  • 我正在使用“org.springframework.transaction.jta.WebLogicJtaTransactionManager”它不允许 EMF 的属性。
  • bean 类 [org.springframework.transaction.jta.WebLogicJtaTransactionManager] 的无效属性 'entityManagerFactory':Bean 属性 'entityManagerFactory' 不可写或具有无效的 setter 方法。 setter的参数类型和getter的返回类型是否匹配?

标签: spring jpa eclipselink jta


【解决方案1】:

请尝试以下 3 个中的任何一个:

1.解决方案1

请拨打以下代码

em.joinTransaction();

就在之前

 em.persistEntity(entity);

2.解决方案2

在@Transactional 中设置属性readOnly=false

3.解决方案3

尝试在spring xml文件中手动添加bean EmployeeDAO

或者你可以试试下面的:

@Transactional(propagation=Propagation.REQUIRED)

【讨论】:

  • 2 和 3 不起作用,不想使用 1 的解决方法
  • 这里的问题是 EntityManager 无法与 JTA Transaction 关联。另一种方式,虽然它是手动启动事务,例如 em.getTransaction(),然后手动启动和提交事务。
  • 请看这篇帖子forum.hibernate.org/…
猜你喜欢
  • 1970-01-01
  • 2017-11-20
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 2023-03-26
  • 2018-07-10
相关资源
最近更新 更多