使用在JBoss上运行的EclipseLink在运行时修改JPA模式

时间:2012-04-03 07:41:09

标签: jpa jboss eclipselink

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

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

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

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

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

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

另一种解决方案是为每个架构提供多个xml配置文件。它似乎不优雅;当我添加一个新实体时,我必须记住将它添加到每个模式的xml文件中。我也不知道如何在多个模式之间进行此连接。

有没有办法解决这个问题?我错过了什么,或者这是否会使JPA超出预期目标?

1 个答案:

答案 0 :(得分:3)

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

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

EclipseLink还允许您设置tableQualifier,该tableQualifier定义默认架构。这可以使用Session登录时的SessionCutsomizer进行设置。