Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JSF/EJB中使用Eclipselink@Multitenant?_Java_Jpa_Eclipselink - Fatal编程技术网

Java 如何在JSF/EJB中使用Eclipselink@Multitenant?

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

Eclipselink 2.3中的@Multitenant支持看起来非常有趣,但我很难理解如何在JSF或EJB中使用它,而JSF或EJB将@PersistenceContext注入EntityManager。EclipseLink文档非常清楚@PersistenceContext注入在这种情况下不起作用,但是您可以通过@PersistenceUunit注入EntityManagerFactory

不过,我没有看到的是如何管理您可能通过EntityManagerFactory.createEntityManager()创建的EntityManager的生命周期,特别是何时关闭生成的EntityManager,以及如何参与事务

有人用过这个吗?还是我遗漏了一些明显的东西

另见:

更新

我在@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并设置属性,或者注入EntityManager工厂并使用joinTransaction()加入活动的JTA事务。

谢谢。我是否正确地理解了“客户端会话”的作用域是单个事务或操作,所以我不需要担心租户泄漏到另一个线程?我认为会话事件侦听器将工作得最好。在注入的EntityManager上并不总是有一个明显的地方可以设置属性,使用EMF并最终在所有地方都必须有{em.close();}的想法是不吸引人的。