java - JPA:在单个持久性单元上映射多个 Oracle 用户

标签 java spring oracle jpa eclipselink

我正在使用 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 ,但我排除它,因为:

Joins across tables in different data sources are not supported.

最佳答案

如果您可以使用相同的数据源访问不同的模式,那么您可以使用 EclipseLink 的定制器更改模式名称,如下所述:http://eclipse.org/eclipselink/documentation/2.5/jpa/extensions/a_customizer.htm 。 您将需要更改实体描述符以及使用连接表的任何 1:M 和 M:M 映射上的表/模式名称。

关于java - JPA:在单个持久性单元上映射多个 Oracle 用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30024793/

相关文章:

java - 如何构建具有网页之间共享功能的 Spring Controller

java - 在通过 Ant 进行 Junit 测试期间无法在 Jar 中找到属性文件

c# - Entity Framework 代码优先字符串与 Oracle Db 的比较

java - Oracle 和 db2 的 CLASSPATH 与 java.library.path 设置

java - 为什么嵌套类在 Java 和 C# 中表现不同?

java - 如何从 JavaFX webviewer 中的一串 html 代码加载网页?

java - Spring Boot 应用程序无法解析 org.springframework.boot 包

spring - 为什么 AuthenticationManager 会抛出 StackOverflowError?

java - DAO 和服务层(JPA/Hibernate + Spring)

sql - 多表连接查询,Oracle SQL 中带有计数