我有一个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");
它按预期工作。
我做错了吗?
最佳做法是什么?
答案 0 :(得分:1)
这就是camel-jpa组件的设计方式。它不是通过相同路径中的不同jpa组件在不同实体管理器之间进行混合。
删除该属性是正确的。
已有一个名为usePassedInEntityManager
的选项,但这仅适用于消息标题,这是由于SwitchYard的特殊要求,它想要提供Camel必须使用的自己的EntityManager
。但是,该选项不适用于交换财产。
不得不再次引入另一个选项,也可能会让用户感到困惑,尽管像你这样有两个不同jpa组件的用户可能会遇到类似的问题,并且可能无法发现他们应该删除该交换属性。