【发布时间】:2015-07-13 12:34:12
【问题描述】:
我正在使用 EclipseLink 2.5.2 (JPA 2.1)、Spring 4.1.5,并且我正在 Weblogic 12 和 Oracle 12c 上进行部署。
我需要部署我的应用程序以使用 2 个模式(同一数据库上的 2 个用户)。第一个包含应用程序数据,第二个包含永远不会更改的查找日期。这是我的客户设置的硬性要求(查找模式可能被其他应用程序使用),但是我知道它们将位于同一个 Oracle 实例上。我的 JPA 数据模型包含来自模式和它们之间的引用的实体。同样,在数据库级别,查找模式的数据模式中存在 FK。
我想:
- 以某种方式映射我的实体,以抽象出它们驻留在不同架构上的事实(使用用户为生成的 SQL 查询添加前缀就足够了)
- 构建可移植的 war 文件(没有硬编码架构)
- 避免使用同义词,它们很难维护,并且这 2 个模式有几个同名的元数据表
我目前的解决方案:
我有一个持久性单元,其中包含两个模式中的所有实体。我为查找实体添加了一个 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 的定制器 eclipse.org/eclipselink/documentation/2.5/jpa/extensions/… 更改模式名称。您将需要更改实体描述符以及使用连接表的任何 1:M 和 M:M 映射上的表/模式名称。
-
嘿@Chris,这就是我目前正在做的事情,我会发布它作为答案。 (其实你也可以发,我接受)谢谢。
-
可以,但这意味着动态修改持久性单元。一个持久化单元应该等同于一个模式。
标签: java spring oracle jpa eclipselink