在Camel路由中使用多个JPA端点的最佳做法是什么?

时间:2017-10-06 08:08:22

标签: jpa apache-camel

我有一个camel路由(Camel 2.19.2),它从一个JPA(Hibernate)端点提取数据,转换它并将其存储到另一个JPA端点。喜欢这个

from("direct:start")
   .to("sourcjpa:com.somepackage.SomeEntity?persistenceUnit=mySource&namedQuery=myQuery")
   .bean("transformBean")
   .to("targetjpa:com.anotherpackage.AnotherEntity");

这失败,错误告诉我实体管理器不知道目标实体类。当我调试它时,我看到Camel正在重用sourcejpa中的实体管理器,它存储在交换属性中。

如果我改变这样的路线:

from("direct:start")
   .to("sourcjpa:com.somepackage.SomeEntity?persistenceUnit=mySource&namedQuery=myQuery")
   .bean("transformBean")
   .removeProperty(JpaConstants.ENTITY_MANAGER)
   .to("targetjpa:com.anotherpackage.AnotherEntity");

它按预期工作。

我做错了吗?

最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

这就是camel-jpa组件的设计方式。它不是通过相同路径中的不同jpa组件在不同实体管理器之间进行混合。

删除该属性是正确的。

已有一个名为usePassedInEntityManager的选项,但这仅适用于消息标题,这是由于SwitchYard的特殊要求,它想要提供Camel必须使用的自己的EntityManager。但是,该选项不适用于交换财产。

不得不再次引入另一个选项,也可能会让用户感到困惑,尽管像你这样有两个不同jpa组件的用户可能会遇到类似的问题,并且可能无法发现他们应该删除该交换属性。