在骆驼路由中使用多个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组件的用户可能会遇到类似的问题,并且可能无法发现他们应该删除该交换属性。