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

时间:2011-09-30 01:58:58

标签: java jpa eclipselink

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);
    }
}

1 个答案:

答案 0 :(得分:0)

使用事件很好。

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