2012-04-03 59 views
1

我是JPA和JBoss的新手,很抱歉如果这是一个愚蠢的问题。在运行时使用在JBoss上运行的EclipseLink修改JPA模式

我使用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超出预期目标?

回答

3

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

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

EclipseLink还允许您设置一个定义默认模式的tableQualifier。这可以使用会话登录中的SessionCutsomizer进行设置。

+0

这意味着我必须为每个独特的模式组合在新的持久性单元中定义一个新的orm.xml文件,对吗?我希望避免这种情况,因为它会导致很多持久性单元和orm.xml文件。 – user1309663 2012-04-04 06:18:18

+1

是否有可能以某种方式获取对当前会话定制器的引用或在运行时更改表限定符?例如:'DatabaseLogin login = server.getLogin();' 'login.setTableQualifier(“MySchema”);' 'session = server.acquireClientSession(login);'这不起作用。 – user1309663 2012-04-04 08:44:51

+0

在并发/共享系统中更改共享配置从来就不是一个好主意。如果你有一个不同的数据库用户默认每个不同的模式,那么当创建一个emf时,你只需要在pu属性中传递用户名。 – James 2012-04-04 14:17:14