gpt4 book ai didi

java - 相对持久性单元注入(inject)?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:24:10 26 4
gpt4 key购买 nike

我有一个存在多个持久性单元定义文件的 Persistence.xml。

我想根据进入系统的用户注入(inject)unit EntityManager对象。

这可能吗?

@PersistenceContext (unitName = myUnit)

在这个使用中,我得到一个警告:“属性值必须是常量”

应用程序框架:JSF 2.1 和 Spring 3.0.2

持久层:JPA

最佳答案

可以使用 CDI 吗?您可以编写一个小类,注入(inject)所有不同的上下文,然后通过执行某些逻辑的生产者方法将它们提供给您的类。有点像这样:

public class PersistenceContext {
@PersistenceContext(unitName="myUnit") private EntityManager myEm;
@PersistenceContext(unitName="yourUnit") private EntityManager yourEm;

@Produces
public EntityManager getEntityManager(InjectionPoint ip) {
if (USER IS ME) {
return myEm;
}
else if (USER IS YOU) {
return yourEm;
}
else {
NOW PANIC AND FREAK OUT
}
}
}

然后你可以像这样写类:

public class FeedReamer {
@Inject private EntityManager em;
}

一切都会神奇地发生(可能?)。

如果您不想在类中硬编码持久性单元的名称,那么您可以显式地获取实体管理器工厂,而不是依赖注入(inject):

    @Produces
public EntityManager getEntityManager(InjectionPoint ip) {
String persistenceUnitName = somehowDeterminePersistenceUnitName();
EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnitName);
return emf.createEntityManager();
}

但是,尽管此方法适用于 J2SE 应用程序,Persistence.createEntityManagerFactory不保证在 J2EE 中工作。规范中的脚注 42(至少是 EJB 3.0 持久性规范)说:

Use of these Java SE bootstrapping APIs may be supported in Java EE containers; however, support for such use is not required.

此外,我认为创建一个新的 EntityManagerFactory 可能会很慢;您可能会发现需要缓存查找结果。我相信长时间持有 EntityManagerFactory 并从多个线程访问它应该是安全的(但我不确定)。

关于java - 相对持久性单元注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8288506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com