JPA动态持久性单元名称

2023-12-25

我需要一种方法来动态指定 EJB 中的持久性单元。

简化示例:

我有一个使用多个数据库作为数据存储的应用程序。 每个数据存储在结构上都是相同的。 根据连接到应用程序的客户端,我需要从中访问数据 特定的数据存储。

因此,我想使用相同的EJB,这样业务逻辑就不会重复, 然后只需根据客户端选择正确的持久性单元即可。

到目前为止,我只是直接向实体管理器注入了硬编码的持久性单元名称。 有没有一种方法可以动态注入实体管理器并将所需的持久性单元附加到 EJB? 另外,持久化单元可以在运行时动态添加吗? 我目前必须在 persistence.xml 文件中指定持久性单元。 理想情况下,我想在系统运行时根据需要在服务器 jdbc/db1、jdbc/db2 等上创建池。然后只需将它们添加到中央客户端数据库并将其链接到客户端,这样当客户端连接时,它将检查池的名称,并在调用 EJB 时使用它来获取持久性单元。

我对 Java EE 开发还很陌生。任何帮助将不胜感激。


遗憾的是,在当前的 JPA 版本中,无法动态创建持久性单元。如果此功能对您很重要,您可以考虑在 JPA 问题跟踪器中为其创建 JIRA 问题:http://java.net/jira/browse/JPA_SPEC http://java.net/jira/browse/JPA_SPEC

使用@PersistenceContext注释,也不可能动态选择特定的持久单元。这实际上是分片的领域,Hibernate 曾经试图解决这个问题,但后来突然停止了。看http://www.hibernate.org/subprojects/shards.html http://www.hibernate.org/subprojects/shards.html

然而,您可以采取一些措施来获得类似的效果。

一种方法是创建一个无状态 EJB/CDI 工厂 bean,将其与所有实体管理器一起注入。这样做的成本是微不足道的,因为这些 Bean 将被集中起来,并且实体管理器的创建成本并不高。

如果您还想根据某些条件注入它们,那么该条件必须从上下文中可用,或者必须在注入点指定(但如果您愿意这样做,您也可以注入正确的实体管理器直接地)。

一个启动示例:

@Stateless
@TransactionAttribute(SUPPORTS)
public class ShardingEntityManagerFactory {

    @Resource
    private SessionContext sessionContext;

    @PersistenceContext(unitName = "pu1")
    private EntityManager entityManager1;

    @PersistenceContext(unitName = "pu2")
    private EntityManager entityManager2;

    @Produces @TransactionScoped @ShardedPersistenceContext
    public EntityManager getEntityManager() {
        if (sessionContext.isCallerInRole("FOO")) {
            return entityManager1;
        } else {
            return entityManager2;
        }
    }
}

然后在你的豆子中:

@Stateless
public class SomeBean {

    @Inject @ShardedPersistenceContext
    private EntityManager entityManager;

    // ...
}

请注意,您需要在此处使用 Seam Persistence@TransactionScoped注解。忘记透明地注入实体管理器并注入ShardingEntityManagerFactory相反,并从中手动获取正确的一个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA动态持久性单元名称 的相关文章

随机推荐

  • Firebird 数据库中的 Netbeans Hibernate 映射文件和 POJO 向导中的 NullPointerException [重复]

    这个问题在这里已经有答案了 我正在使用 netbeans hibernate 和 firebird 开发桌面应用程序 该向导不会给我创建文件 hibernate cfg xml 带来麻烦 或 HibernateUtil java 但通过尝试
  • 将图像坐标系的原点更改为左下角而不是默认的左上角

    有没有一种简单的方法可以将OpenCV图像坐标系的原点更改为左下角 使用numpy例如 我正在使用 OpenCv 2 4 12 和 Python 2 7 有关的 Numpy 翻转坐标系 https stackoverflow com que
  • HTML 音频无法设置 currentTime

    我正在使用 Chrome 在我的开发工具控制台中 我尝试了以下操作 除了最后一行之外 一切都按预期工作 为什么我不能设置currentTime on it 总的来说 我发现整个 HTML5 Audio 的东西不是很可靠 是否有一个强大的 j
  • Java 中有 TimeSpan 类吗

    我只是想知道是否需要 TimeSpanjava util这样我就可以定义这两个时间之间有多少小时 分钟和秒 由此TimeSpan我们可以在两个时间之间设置一个时间间隔 喜欢 TimeSpan getTimeSpan Date before
  • Google Cloud 文本转语音界面混乱(如何下载 mp3 文件?)

    我想以这样的事实作为序言 我不是程序员 开发人员 我是多媒体设计师 我使用文本转语音来生成占位符音频文件 这些文件可用于在录制官方音频旁白之前为动画计时 之前我使用的是 Amazon Polly 但我想尝试一下 Google Cloud 然
  • 如何在 remix run 应用程序中加载 Svg 组件

    我有一些 Svg 文件 我想将它们作为 React 组件加载到 remix run 应用程序中 例如在创建反应应用程序 https create react app dev docs adding images fonts and file
  • marshmallow - 序列化时如何将架构属性映射到另一个键?

    我需要创建一个与给定规范一致的棉花糖模式 其中我无法更改键名称 其中一个关键是 Python 中的保留关键字 from class TemporalExtentSchema Schema from fields String require
  • 如何为 Python 设置 LIBSVM

    I built libsvm http www csie ntu edu tw cjlin libsvm 在 Mac OS X 上使用 Make tar xzfv libsvm 3 17 tar gz cd libsvm 3 17 make
  • 如何在SQL Server 2008中检查字符串是否是阿拉伯语言

    如何检查字符串是否为阿拉伯语 我必须将语言 ID 列更新为英语或阿拉伯语 IF PATINDEX RTRIM STRING 0 BEGIN SET RETURNVALUE A END ELSE IF PATINDEX A Za z RTRI
  • Android Retrofit 预期为 BEGIN_OBJECT,但在第 1 行第 1 列路径 $ 处为 STRING

    我在 Android 应用程序中使用 okhttp Retrofit 来发出网络请求 在其中一个请求中 我收到此错误 com google gson JsonSyntaxException java lang IllegalStateExc
  • PEG 和 CFG 有什么区别?

    由此维基百科 http en wikipedia org wiki Parsing expression grammar Semantics page 之间的根本区别 上下文无关语法和解析 表达式语法是 PEG 的 选择运算符是有序的 如果
  • Google Analytics - 使用两个帐户进行异步跟踪

    我目前正在同一页面上使用两个不同的跟踪代码来测试 GA 新的异步代码片段 gaq push setAccount UA XXXXXXXX 1 trackPageview b setAccount UA XXXXXXXX 2 b trackP
  • 将闭包更新到 Swift 3 - @escaping

    我已将代码更新到 Xcode 8 0 beta 6 但我陷入了似乎与新的非转义闭包默认值有关的问题 在下面的代码中 Xcode 建议添加 escaping在 前面completion 在下面代码的第一行中 但仍然无法编译并继续循环 EDIT
  • “向‘日期时间’列添加值导致溢出。”

    In the MSDN明确表示 日期参数不能递增到其数据类型范围之外的值 在以下语句中 与日期值相加的数值超出了日期数据类型的范围 返回以下错误消息 向 日期时间 列添加值导致溢出 以及例子 SELECT DATEADD year 2147
  • 将 JSON 对象反序列化为 C# 对象

    我正在尝试使用 RestSharp 读取一些 json 数据 但我在读取 json 对象时遇到一些问题 我有这样的回应 expand html self
  • jquery 函数根本不触发

    真正的愚蠢问题 我想我现在应该已经明白了这一点 但我显然错过了一些东西 我希望我的函数在页面加载后立即触发 以检查变量的值 并根据该值使按钮出现或消失 但我写的函数永远不会被调用 我将该函数放置在 Load 和 document ready
  • 容器管理的事务无法回滚

    我正在玩交易 我配置了 JPA 来处理我的实体 并希望将它们保存在数据库中 问题是 当我的程序抛出runtimeException时 CMT不会回滚 这个 容器事物 背后的想法很难理解 而且记录也很少 transactional 托管事务
  • 如何使用 Java 更有效地反转数字

    我编写了一些代码来反转数字 如下所示 long num 123456789 char arr String valueOf num toCharArray List
  • 当线程被中断/终止时,finally 块可能不会被执行吗?

    In Java 教程 http docs oracle com javase tutorial essential exceptions finally html它说的是try finally 注意 如果在执行 try 或 catch 代码
  • JPA动态持久性单元名称

    我需要一种方法来动态指定 EJB 中的持久性单元 简化示例 我有一个使用多个数据库作为数据存储的应用程序 每个数据存储在结构上都是相同的 根据连接到应用程序的客户端 我需要从中访问数据 特定的数据存储 因此 我想使用相同的EJB 这样业务逻