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