在骆驼路由中使用多个JPA端点的最佳做法
问题描述:
我有一个驼峰路由(驼峰2.19.2),它从一个JPA(Hibernate)端点提取数据,将其转换并存储到另一个JPA端点。像这样在骆驼路由中使用多个JPA端点的最佳做法
from("direct:start")
.to("sourcjpa:com.somepackage.SomeEntity?persistenceUnit=mySource&namedQuery=myQuery")
.bean("transformBean")
.to("targetjpa:com.anotherpackage.AnotherEntity");
这会失败,错误告诉我目标实体类不为实体管理器所知。当我调试它时,我发现骆驼正在重用sourcejpa中的实体管理器,它存储在交换属性中。
如果我改变这样的路线:
from("direct:start")
.to("sourcjpa:com.somepackage.SomeEntity?persistenceUnit=mySource&namedQuery=myQuery")
.bean("transformBean")
.removeProperty(JpaConstants.ENTITY_MANAGER)
.to("targetjpa:com.anotherpackage.AnotherEntity");
它可以作为我的预期。
我做错了吗?
这是什么最佳做法?
答
这就是骆驼-jpa组件的设计原理。它不是通过相同的路由通过不同的jpa组件在不同的实体管理器之间进行混合。
所以你是正确的,通过删除该属性。
已经有一个选项名为usePassedInEntityManager
,但这只适用于由于SwitchYard的特殊要求而产生的消息头,该消息头希望提供他们自己的EntityManager
骆驼必须使用的。但是,该选项不适用于交换财产。
不得不再次引入另一个选项,也可能会让用户感到困惑,尽管像您这样使用两个不同jpa组件的用户可能会遇到类似的问题,并且可能无法发现他们应该删除该交换属性。