JPA:在单个持久性单元上映射多个 Oracle 用户
JPA: Map multiple Oracle users on single persistence unit
我正在使用 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,但我排除它是因为:
Joins across tables in different data sources are not supported.
如果您可以使用相同的数据源来访问不同的模式,那么您可以使用 EclipseLink 的定制器更改模式名称,如下所述:http://eclipse.org/eclipselink/documentation/2.5/jpa/extensions/a_customizer.htm。
您将需要更改实体描述符以及任何使用联接 table 的 1:M 和 M:M 映射中的 table/schema 名称。
我正在使用 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,但我排除它是因为:
Joins across tables in different data sources are not supported.
如果您可以使用相同的数据源来访问不同的模式,那么您可以使用 EclipseLink 的定制器更改模式名称,如下所述:http://eclipse.org/eclipselink/documentation/2.5/jpa/extensions/a_customizer.htm。 您将需要更改实体描述符以及任何使用联接 table 的 1:M 和 M:M 映射中的 table/schema 名称。