私はcamel jpaコンポーネントを使用してデータベースにエンティティを書き込もうとしています。問題は私が得ることですcamel-jpa「トランザクションが進行中ではありません」
javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.internal.SessionImpl.checkTransactionNeeded(SessionImpl.java:3428)
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1395)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1391)
at org.apache.camel.component.jpa.JpaProducer$1.doInTransaction(JpaProducer.java:85)
永続ユニットが解析され、テーブルが作成されます。ここイストにpersistence.xml:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="pu" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver" />
<property name="hibernate.connection.url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="hibernate.connection.username" value="user" />
<property name="hibernate.connection.password" value="pass" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
私は1つのエンティティを書き込むためのテストを作成しました:
/**
* Created by moritz on 16.09.2016.
*/
public class JpaTest extends CamelTestSupport {
@EndpointInject(uri = "mock:out")
protected MockEndpoint out;
@EndpointInject(uri = "direct:in")
protected DirectEndpoint in;
@EndpointInject()
@Test
public void writeSome() throws Exception {
PartnerFactaEntity e = new PartnerFactaEntity();
e.setNameIrs("huhu");
e.setPartnerId("1");
e.setUsDokumentGueltigBis(new Date());
e.setUsDokumentGueltigVon(new Date());
context.start();
ProducerTemplate template = context.createProducerTemplate();
template.sendBody(in, e);
}
@Before
public void setup() throws Exception {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("pu");
// ((JndiRegistry) context.getRegistry()).bind(
// "EntityManagerFactory", emf);
// ((JndiRegistry) context.getRegistry()).bind("TransactionManager",
// new JpaTransactionManager());
JpaComponent jpaComponent = context.getComponent("jpa", JpaComponent.class);
jpaComponent.setEntityManagerFactory(emf);
JpaTransactionManager taM = new JpaTransactionManager();
taM.setEntityManagerFactory(emf);
jpaComponent.setTransactionManager(taM);
context.addRoutes(new TestRoute());
}
@Override
public boolean isUseRouteBuilder() {
return false;
}
private class TestRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
from(in).to("jpa:PartnerFactaEntity").to(out);
}
}
}
ラクダのセマンティックでトランザクションを開始し、終了する本当の方法はありませんので、私は問題が関連していると思います設定する?
これを修正するにはどうすればよいですか?
EDIT
は私がサンタクロースの助言に従い、ルートに.transacted()
を追加しました。
((JndiRegistry)((PropertyPlaceholderDelegateRegistry) context.getRegistry()).getRegistry()).bind("PlatformTransactionManager", taM );
を、これが再びjavax.persistence.TransactionRequiredException: no transaction is in progress
が得られます。これはNo bean could be found in the registry of type: PlatformTransactionManager
が、私はセットアップ方法に次の行を追加生み出します。
JpaComponentで何を設定するのか、レジストリにバインドするものがわかりません。
私は少しデバッグしました。私は、entityManager.flush()
が例外をスローしているJpaProducerのフィールドを調べました。 trasactionTemplateは正しいJpaTransactionManagerで "PRPAGATION_REQUIRED、ISOLATION_DEFAULT"に設定されています。
キャメルにキャメルに伝えるためにあなたが必要とするtransacted()がありますトランザクション。 http://camel.apache.org/transactional-client.html –
私はそれを試しましたが、それは助けになりませんでした - 私の編集を参照してください – dermoritz