2011-09-30 55 views
1

Eclipselink 2.3中的@Multitenant支持看起來非常有趣,但我很難理解如何在使用@PersistenceContext注入EntityManager的JSF或EJB中使用它。 EclipseLink文檔非常清晰,在這種情況下@PersistenceContext注入不起作用,但您可以通過@PersistenceUunit注入一個EntityManagerFactory。如何在JSF/EJB中使用Eclipselink @Multitenant?

但是,我沒有看到如何管理EntityManager的生命週期,您可以通過注入EntityManagerFactory.createEntityManager()來創建 - 特別是何時關閉生成的EntityManager以及如何參與事務。

有沒有人得到這個工作?還是我錯過了明顯的東西?

參見:http://wiki.eclipse.org/EclipseLink/Examples/JPA/Multitenant

UPDATE

我取得了一些成功@PersistenceContext(EntityManager的)注射,然後通過會話監聽器傳遞參數的EclipseLink。我不是100%肯定這是正確的答案,並希望確認它不會造成非顯而易見的競爭條件或線程安全問題。

例如:

public static class TenantListener extends SessionEventAdapter { 

    @Override 
    public void postAcquireClientSession(SessionEvent event) { 
     long tenantId = **business logic**; 
     event.getSession().setProperty("eclipselink.tenant-id", tenantId); 
    } 
} 

回答

0

使用事件是好的。

您也可以注入EntityManager並設置屬性,或注入EntityManagerFactory並使用joinTransaction()加入活動的JTA事務。

+0

謝謝。我是否正確理解「客戶端會話」被限定爲單個事務或操作,所以我不需要擔心租戶泄漏到另一個線程? 我認爲會話事件偵聽器將工作得最好。在注入EntityManager中設置屬性並不總是有一個顯而易見的地方,並且使用EMF的思想並不得不終於{em.close(); }到處都沒有吸引力。 – wrschneider