【问题标题】:How to use Eclipselink @Multitenant in JSF/EJB?如何在 JSF/EJB 中使用 Eclipselink @Multitenant?
【发布时间】:2011-09-30 01:58:58
【问题描述】:

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

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

有人让这个工作吗?还是我遗漏了一些明显的东西?

另请参阅:http://wiki.eclipse.org/EclipseLink/Examples/JPA/Multitenant

更新

我在@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);
    }
}

【问题讨论】:

    标签: java jpa eclipselink


    【解决方案1】:

    使用事件很好。

    您也可以注入 EntityManager 并设置属性,或者注入 EntityManagerFactory 并使用 joinTransaction() 加入活动的 JTA 事务。

    【讨论】:

    • 谢谢。我是否正确理解“客户端会话”的范围仅限于单个事务或操作,所以我不需要担心租户泄漏到另一个线程?我认为会话事件侦听器效果最好。在注入的 EntityManager 上设置属性并不总是一个明显的地方,并且考虑使用 EMF 并且必须最终 { em.close(); } 到处都没有吸引力。
    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多