gpt4 book ai didi

java - LocalContainerEntityManagerFactoryBean 中的 EntityManager 不会将实体保存到数据库中

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:50:00 26 4
gpt4 key购买 nike

问题在于在 Spring 托管 bean 中注入(inject) @PersistenceContextEntityManager 不会将实体持久保存到数据库中。我尝试在 AddDao bean 上使用 @Transactional,其中调用了 entityManager.persist()(我启用了注解驱动的事务)。

事务开始于另一个由 Camel 在 Camel Java DSL 中使用 .transacted() 实例化的 bean。该 bean 有一个 @Autowired 属性,它是 DAO 并且有 EntityManager 注入(inject)了 @PersistenceContext

使用事务管理器 Bitronix。

Spring xml 配置文件的一部分如下所示:

  <bean id="localContainerEntityManagerFactoryBean" depends-on="btmConfig" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jtaDataSource" ref="dataSource"/>
<property name="persistenceUnitName" value="nameFromPersistenceXml"/>
<property name="persistenceProvider">
<bean class="org.hibernate.ejb.HibernatePersistence"/>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
</property>
<property name="packagesToScan" value="package with @Entity POJOs"/>

</bean>



<bean id="btmConfig" factory-method="getConfiguration"
class="bitronix.tm.TransactionManagerServices">
<property name="serverId" value="spring-btm" />
</bean>

<!-- create BTM transaction manager -->
<bean id="BitronixTransactionManager" factory-method="getTransactionManager"
class="bitronix.tm.TransactionManagerServices" depends-on="btmConfig"
destroy-method="shutdown" />
<!-- Spring JtaTransactionManager -->
<bean id="springTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="BitronixTransactionManager" />
<property name="userTransaction" ref="BitronixTransactionManager" />
</bean>

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

编辑:在过于简化的版本中,它看起来像这样:

在 Camel Java DSL 中有

from("wsLayer")
.transacted()
.otherProcessing()
.to("bean:addBean?method=addMyEntity")

添加 bean 看起来像这样:

@Component
public class AddBean {
@Autowired
private AddDao addDao;

public void addMyEntity(MyEntity myEntity) {
//other business logic
addDao.persistMyEntity(myEntity);
}
}

@Component
public class AddDao {
@PersistenceContext
private EntityManager entityManager;

//I have tried here
//@Transactional and
//@Transactional(propagation = PropagationType.REQUIRES_NEW)
public void persistMyEntity(MyEntity myEntity) {
entityManager.persist(myEntity);
}
}

从数据库读取效果很好。

查看数据来源:

<bean id="dataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource"
init-method="init" destroy-method="close">
<property name="uniqueName" value="theName" />
<property name="maxPoolSize" ><value>${db.pool.maxSize}</value></property>
<property name="minPoolSize" ><value>${db.pool.minSize}</value></property>
<property name="allowLocalTransactions" ><value>true</value></property>
<property name="automaticEnlistingEnabled" ><value>true</value></property>
<property name="className" ><value>${db.pool.datasource}</value></property>
<property name="driverProperties" ref="databaseProperties" />
</bean>

在 Maven 的 pom.xml 中设置属性的位置如下:

 db.pool.maxSize=15
db.pool.maxSize=5
db.pool.datasource=org.postgresql.xa.PGXADataSource

最佳答案

您是否尝试在 em.persist(entity) 之后执行 em.flush()?根据 Java EE 的文档:

em.persist(entity):使一个实例被管理和持久化。但em.flush(entity):将持久化上下文同步到底层数据库。

所以,你可以这样做:

em.persist(myEntity);
em.flush();

并检查此更改是否有所作为。

关于java - LocalContainerEntityManagerFactoryBean 中的 EntityManager 不会将实体保存到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16420653/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com