2017-10-06 32 views
0

我有一個駝峯路由(駝峯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"); 

它可以作爲我的預期。

我做錯了嗎?

這是什麼最佳做法?

回答

1

這就是駱駝-jpa組件的設計原理。它不是通過相同的路由通過不同的jpa組件在不同的實體管理器之間進行混合。

所以你是正確的,通過刪除該屬性。

已經有一個選項名爲usePassedInEntityManager,但這隻適用於由於SwitchYard的特殊要求而產生的消息頭,該消息頭希望提供他們自己的EntityManager駱駝必須使用的。但是,該選項不適用於交換財產。

不得不再次引入另一個選項,也可能會讓用戶感到困惑,儘管像您這樣使用兩個不同jpa組件的用戶可能會遇到類似的問題,並且可能無法發現他們應該刪除該交換屬性。