簡體   English   中英

相當於Karaf / OSGI中的StickySession嗎?

[英]An equivalent to StickySession in Karaf/OSGI?

問題如下:在一個Karaf容器中,我有兩個模塊,第一個模塊用於通過Hibernate實現的JPA接口在DB中獲取數據。 收集是通過懶惰的方式獲取的。 第二個模塊獲取包含集合的對象。 嘗試訪問集合的元素時,將引發錯誤:

failed to lazily initialize a collection of role:
 mapp3.model.ProductDefinition, could not initialize proxy - no Session

它沒有會話可以訪問數據庫並獲取缺少的元素。 我知道在J2EE中有一個粘性會話的概念,它使線程可以在所有bean中創建並共享相同的會話。

在Karaf / OSGi中有類似的東西嗎?還是有另一種方法可以正確地實現不同模塊之間的延遲加載?

我剛剛在Aries JPA 2.1.0中實現了類似的功能。 它使用OSGi協調器規范在線程上共享EntityManager會話。 它與Aries交易藍圖1.3.0一起使用,該藍圖現在也使用了Coordination。 兩者均可在Apache Karaf 4.0.1中使用。

因此,要實現在多個bean之間的多次調用中保持會話狀態,您需要注釋@Transactional所涉及的最外層方法。 如果您不希望實際的交易,而只是共享的EM,則可以將@Transaction與Support類型一起使用。 因此,從該方法開始,所有向下調用將共享相同的em。

因此,例如,您可以執行以下操作:

@Transactional
public void myServiceMethod() {
   Person person = personRepo.getPerson();
   List<Task> person.getTask();
}

因此,在上面的示例中,PersonRepo將使用@PersistenceContext注入EntityManager並對其進行處理。

MyService.myServiceMethod將在服務層上,並且不應了解jpa或EntityManager。 仍然使用@Transactional注釋,該方法將在執行包含EntityManager的方法的過程中提供協調。

另請參閱示例Apache Karaf教程第9部分-基於注釋的藍圖和JPA 該示例未顯示總體@Transactional,但如果您想深入了解它,可以輕松入門。 一旦即將發布的白羊座發布完成,我還將創建一個示例,確切顯示您正在尋找的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM