Java 如何在JSF/EJB中使用Eclipselink@Multitenant?
Eclipselink 2.3中的@Multitenant支持看起来非常有趣,但我很难理解如何在JSF或EJB中使用它,而JSF或EJB将@PersistenceContext注入EntityManager。EclipseLink文档非常清楚@PersistenceContext注入在这种情况下不起作用,但是您可以通过@PersistenceUunit注入EntityManagerFactory 不过,我没有看到的是如何管理您可能通过EntityManagerFactory.createEntityManager()创建的EntityManager的生命周期,特别是何时关闭生成的EntityManager,以及如何参与事务 有人用过这个吗?还是我遗漏了一些明显的东西 另见: 更新 我在@PersistenceContext(EntityManager)注入方面取得了一些成功,然后通过会话侦听器将参数传递给EclipseLink。我不是100%确定这是正确的答案,并希望确认它没有造成不明显的竞态条件或线程安全问题 例如:Java 如何在JSF/EJB中使用Eclipselink@Multitenant?,java,jpa,eclipselink,Java,Jpa,Eclipselink,Eclipselink 2.3中的@Multitenant支持看起来非常有趣,但我很难理解如何在JSF或EJB中使用它,而JSF或EJB将@PersistenceContext注入EntityManager。EclipseLink文档非常清楚@PersistenceContext注入在这种情况下不起作用,但是您可以通过@PersistenceUunit注入EntityManagerFactory 不过,我没有看到的是如何管理您可能通过EntityManagerFactory.createEnti
public static class TenantListener extends SessionEventAdapter {
@Override
public void postAcquireClientSession(SessionEvent event) {
long tenantId = **business logic**;
event.getSession().setProperty("eclipselink.tenant-id", tenantId);
}
}
使用事件是可以的
您还可以注入EntityManager并设置属性,或者注入EntityManager工厂并使用joinTransaction()加入活动的JTA事务。谢谢。我是否正确地理解了“客户端会话”的作用域是单个事务或操作,所以我不需要担心租户泄漏到另一个线程?我认为会话事件侦听器将工作得最好。在注入的EntityManager上并不总是有一个明显的地方可以设置属性,使用EMF并最终在所有地方都必须有{em.close();}的想法是不吸引人的。