【问题标题】:Modify JPA schema at runtime with EclipseLink running on JBoss使用在 JBoss 上运行的 EclipseLink 在运行时修改 JPA 模式
【发布时间】:2012-04-03 07:41:08
【问题描述】:

我是 JPA 和 JBoss 的新手,如果这是一个愚蠢的问题,请提前道歉。

我的应用程序使用 EclipseLink 在 JBoss 上运行,该应用程序根据 JPQL 字符串从各种数据库中检索实体。这很好用,除了一个数据库包含多个模式。我希望能够在运行时指定要使用的架构,并选择属于该架构的所有实体,而无需修改 JPQL 字符串。

为了使事情更复杂,我还想在同一个查询中加入跨模式。在这种情况下,JPQL 查询可能会发生变化,或者可以设置指定每个实体架构的参数。

经过一番搜索,我发现了这个:

JPA: How do I specify the table name corresponding to a class at runtime?

其中有一个使用 ASM 动态修改 Table 注释的解决方案。我曾尝试使用它来修改 Table 注释的架构属性,但对于我的生活,我无法让它工作;似乎 Eclipse Link 使用不同的类加载器来初始化我不知道如何访问的实体类,因此更改注释没有效果。

另一种解决方案是为每个架构设置多个 xml 配置文件。看起来不优雅;当我添加一个新实体时,我必须记住将它添加到每个架构的 xml 文件中。我也不知道如何跨多个架构进行此连接。

有没有办法解决这个问题?我是否遗漏了什么,或者这是否使 JPA 超出了它的预期?

【问题讨论】:

    标签: jpa jboss eclipselink


    【解决方案1】:

    每个架构应该有不同的持久性单元。您可以使用相同的类/映射,只需要一个定义不同默认模式的 orm.xml 文件。该文件不需要任何其他内容,您仍然可以将对象映射到注释中,或单独的 orm.xml 文件中。

    要拥有一个持久化单元,其中一些对象在一个模式中,一些对象在另一个模式中,您可以再次在 orm.xml 文件中执行此操作。您只需要在 orm.xml 文件中包含使用非默认模式的实体。 EclipseLink 总是将注解和 XML 合并,因此您可以同时使用两者,并且只在 xml 中添加您需要的内容。

    EclipseLink 还允许您设置定义默认模式的 tableQualifier。这可以在 Session 登录时使用 SessionCutsomizer 进行设置。

    【讨论】:

    • 这意味着我必须在新的持久性单元中为模式的每个唯一组合定义一个新的 orm.xml 文件,对吗?我希望避免这种情况,因为它会导致许多持久性单元和 orm.xml 文件。
    • 是否有可能以某种方式获取对当前会话定制器的引用或在运行时更改表限定符?类似:DatabaseLogin login = server.getLogin();login.setTableQualifier("MySchema");session = server.acquireClientSession(login); 不幸的是,这不起作用。
    • 在并发/共享系统中更改共享配置绝不是一个好主意。如果您有一个不同的数据库用户默认使用每个不同的模式,那么您只需要在创建 emf 时在 pu 属性中传递用户名
    • 谢谢詹姆斯。不幸的是,我无法修改数据库。我在找不到不同的 orm 文件时遇到了问题(它们似乎被忽略了),并且无论如何它都使用默认模式。因此,我将 persistence.xml 文件和所有实体类移动到一个单独的 jar 文件中(配置在 EAR 文件中,我通过 jar 文件引用它,并认为这可能导致它在错误的地方)。这让我后退了一步,现在它甚至无法找到实体,即使它们在类元素中被引用。
    猜你喜欢
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多