gpt4 book ai didi

java - 事务和 JPA/Persistence.xml

转载 作者:搜寻专家 更新时间:2023-11-01 03:05:27 25 4
gpt4 key购买 nike

我在使用 Hibernate 的 JPA 实现进行交易时遇到问题(我正在关注 Camel Tracer example)

我正在使用 Hibernate JPA 实现:

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.5.Final</version>
</dependency>

如果我在我的 META-INF 文件夹中包含一个 persistence.xml,一切正常:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="1.0">
<persistence-unit name="tracer" transaction-type="RESOURCE_LOCAL">
<class>org.apache.camel.processor.interceptor.jpa.JpaTraceEventMessage</class>
<properties>
<property name="hibernate.dialect" value="..."/>
<property name="hibernate.connection.driver_class" value="..."/>
<property name="hibernate.connection.url" value="..."/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.connection.username" value="..." />
<property name="hibernate.connection.password" value="..."/>
</properties>
</persistence-unit>
</persistence>

我想使用 Java 方式,所以我删除了 persistence.xml 并创建了以下 bean:

@Configuration
@EnableTransactionManagement
public class AppConfiguration
{
@Bean public EntityManagerFactory entMngFac()
{
EntityManagerFactory emf = Persistence.createEntityManagerFactory("tracer");
return emf;
}
@Bean public DataSource ds()
{
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("...");
dataSource.setUrl("...");
dataSource.setUsername( "..." );
dataSource.setPassword( "..." );
return dataSource;
}
@Bean public PlatformTransactionManager ptm(EntityManagerFactory emf, DataSource ds)
{
JpaTransactionManager jpat = new JpaTransactionManager();
jpat.setDataSource(ds);
jpat.setEntityManagerFactory(emf);
return jpat;
}
@Bean public TransactionTemplate tranTemp(PlatformTransactionManager ptm)
{
TransactionTemplate tt = new TransactionTemplate();
tt.setTransactionManager(ptm);
return tt;
}
}

保存后,当 Camel 尝试刷新它创建的 JPATracer 对象时,出现以下异常:

javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1171)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1332)
at org.apache.camel.component.jpa.JpaProducer$1.doInTransaction(JpaProducer.java:86)

这有点奇怪,因为“没有正在进行的事务”错误来自“doInTransaction”方法。

我的想法是 Camel 正在启动事务,然后 Hibernate 正在尝试刷新对象并且不知道 Camel 已经启动的事务?所以在某处混合了一些交易,但我不知道在哪里。

最佳答案

尝试使用以下 EntityManagerFactory 配置(注意 packagesToScan 调用)

@Bean
public EntityManagerFactory entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(ds());
em.setPackagesToScan(new String[] { "org.apache.camel.processor.interceptor.jpa" });
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
return em.getObject();
}

关于java - 事务和 JPA/Persistence.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24477018/

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