我正在使用EclipseLink 2.5.2(JPA 2.1),Spring 4.1.5,并且正在Weblogic 12和Oracle 12c上进行部署。
我需要将我的应用程序部署为使用2个模式(同一数据库上2个用户)。第一个包含应用程序数据,第二个包含永不更改的查找日期。这是我的客户端设置的一项硬性要求(其他应用程序可能使用查找模式),但是我知道它们将在同一Oracle实例上。我的JPA数据模型包含来自架构的实体以及它们之间的引用。同样,在数据库级别,查找模式的数据模式中有FK。
我想要:
映射我的实体的方式可以抽象出它们驻留在不同架构上的事实(将生成的SQL查询前缀给用户就足够了)
建立可移植的war文件(不会硬编码任何模式)
避免使用同义词,它们很难维护,并且两个模式具有几个具有相同名称的元数据表
我当前的解决方案:
我有一个包含两个模式中所有实体的持久性单元。我为查找实体添加了一个orm.xml,在其中通过Maven在构建时定义其架构:
<entity class="my.package.lookup.ActionTaken">
<table name="ACTION_TAKEN" schema="${db.lookup.username}"/>
</entity>
我这样做是为了避免在查询实体的@Table批注中对查询架构进行硬编码。
这很好用,生成的SQL在查找模式中具有正确的表前缀。问题是,但是,由于查找模式是在构建时定义的,因此生成的war文件不可移植。
关于如何实现这一点的任何想法?
还有一些想法:
我目前只有一个持久性单元。我认为多个持久性单元不能与第一个持久性单元中的实体引用第二个持久性单元中的实体很好地配合。
我试图让Spring过滤orm.xml文件(即我可以在Spring配置文件中定义查找模式),但是Spring似乎只能过滤自己的配置。
EclipseLink具有自己的Composite persistence unit,但我将其排除在外是因为:
不支持跨不同数据源中的表的联接。
最佳答案
如果可以使用相同的数据源来访问不同的模式,那么可以使用EclipseLink的定制器来更改模式名称,如下所述:http://eclipse.org/eclipselink/documentation/2.5/jpa/extensions/a_customizer.htm。
您将需要在实体的描述符以及使用联接表的任何1:M和M:M映射上都更改表/方案名称。