Eclipselink 2.3中的@Multitenant支持看起来非常有趣,但我很难理解如何在JSF或EJB中使用它,它使用@PersistenceContext注入EntityManager。 EclipseLink文档非常清楚@PersistenceContext注入在这种情况下不起作用,但您可以通过@PersistenceUunit注入EntityManagerFactory。
但是,我没有看到的是如何管理您可能通过注入的EntityManagerFactory.createEntityManager()创建的EntityManager的生命周期 - 特别是何时关闭生成的EntityManager,以及如何参与事务。
有没有人让这个工作?或者我错过了一些明显的东西?
另请参阅:http://wiki.eclipse.org/EclipseLink/Examples/JPA/Multitenant
更新
我在@PersistenceContext(EntityManager)注入方面取得了一些成功,然后通过会话侦听器将参数传递给EclipseLink。我不是百分百肯定这是正确的答案,并希望确认它不会造成非明显的竞争条件或线程安全问题。
例如:
public static class TenantListener extends SessionEventAdapter {
@Override
public void postAcquireClientSession(SessionEvent event) {
long tenantId = **business logic**;
event.getSession().setProperty("eclipselink.tenant-id", tenantId);
}
}
答案 0 :(得分:0)
使用事件很好。
您也可以注入EntityManager并设置属性,或者注入EntityManagerFactory并使用joinTransaction()来加入活动的JTA事务。