我是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超出预期目标?
这意味着我必须为每个独特的模式组合在新的持久性单元中定义一个新的orm.xml文件,对吗?我希望避免这种情况,因为它会导致很多持久性单元和orm.xml文件。 – user1309663 2012-04-04 06:18:18
是否有可能以某种方式获取对当前会话定制器的引用或在运行时更改表限定符?例如:'DatabaseLogin login = server.getLogin();' 'login.setTableQualifier(“MySchema”);' 'session = server.acquireClientSession(login);'这不起作用。 – user1309663 2012-04-04 08:44:51
在并发/共享系统中更改共享配置从来就不是一个好主意。如果你有一个不同的数据库用户默认每个不同的模式,那么当创建一个emf时,你只需要在pu属性中传递用户名。 – James 2012-04-04 14:17:14