2016-09-19 21 views
0

私は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"に設定されています。

+0

キャメルにキャメルに伝えるためにあなたが必要とするtransacted()がありますトランザクション。 http://camel.apache.org/transactional-client.html –

+0

私はそれを試しましたが、それは助けになりませんでした - 私の編集を参照してください – dermoritz

答えて

0

SpringTransactionPolicy policy = new SpringTransactionPolicy(); 
    policy = policy.setTransactionManager(taM); 
    policy.setPropagationBehav‌​iourName("PROPAGATIO‌​N_REQUIRES_NEW"); 

、セットアップでBeanインスタンスを同じ方法で作成することができます https://camel.apache.org/transactional-client.html][1]

<bean id="PROPAGATION_REQUIRES_NEW" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> 
    <property name="transactionManager" ref="jmsTransactionManager"/> 
    <property name="propagationBehaviorName" value="PROPAGATION_REQUIRES_NEW"/> 
</bean> 

.transacted("PROPAGATION_REQUIRES_NEW") 
+0

ありがとう、javaでこれを行う方法はありますか? – dermoritz

0

[トランザクション

を開始するのにREQUIRES_NEWトランザクションポリシーを使用して試してみて、コンテキスト

に追加
関連する問題