在使用JPA时,如何在部署时为序列设置模式名称?

Ama*_*icA 5 java oracle persistence jpa

出于安全原因,我们的oracle db对象通常属于与登录用户不同的模式.例如.表位于xx_core中,我们登录的用户是xx_app_yy.在我的persistence.xml中,我定义了一个orm文件,以便我可以在部署时指定模式名称,例如: <mapping-file>xx_schema_orm.xml</mapping-file>

然后在xx_schema_orm.xml中我可以定义对象拥有模式,例如:

<persistence-unit-metadata>
  <persistence-unit-defaults>
    <schema>xx_core</schema>
  </persistence-unit-defaults>
</persistence-unit-metadata>
Run Code Online (Sandbox Code Playgroud)

这适用于表格,但我找不到序列的等价物.它尝试使用没有模式名称的序列,然后我得到一个例外:

2010-10-14 03:04:05,423:DEBUG   could not get next sequence value [select xx_SEQ.nextval from dual]     - org.hibernate.util.JDBCExceptionReporter
java.sql.SQLException: ORA-02289: sequence does not exist

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)

我试图将模式名称设置为xx_schema_orm.xml中生成器的序列名称的一部分,但无法使其工作,例如:

<sequence-generator name="xx_SEQ_GEN"
sequence-name="xx_core.xx_SEQ"/>
Run Code Online (Sandbox Code Playgroud)

我可以尝试的解决方法:

  • 为用户模式中的序列创建数据库SYNONYM.
  • 停止使用序列并使用其他方式生成ID.

Pas*_*ent 4

在 JPA 2.0 中:

  • 注释@SequenceGenerator和等效sequence-generator元素确实允许指定schema(和catalog)名称
  • schema元素也应该受到序列生成器的尊重

但这不适用于 JPA 1.0。

我将仅引用有关子元素的部分schema来说明差异(下面的参考文献中提到了其他相关部分)。来自 JPA 2.0 规范:

12.2.1.1 架构

schema子元素适用于持久性单元中的所有实体、表、辅助表、连接表、集合表、表生成器和 序列生成器。

schema子元素被schema该元素的任何子元素 覆盖entity-mappings;实体上的或注释schema 中明确指定的 任何元素,或者元素内定义的任何或 子元素上的任何属性 ;注释或 子元素中明确指定的 任何元素;在注释或 子元素中显式指定的任何模式元素;注释或 子元素中明确指定的任何 元素;以及在注释或 子元素中显式指定的任何模式元素。TableSecondaryTableschematablesecondary-tableentityschemaTableGeneratortable-generatorSequenceGeneratorsequence-generatorschemaJoinTablejoin-tableCollectionTablecollection-table

来自 JPA 1.0 规范:

10.1.1.1 架构

schema子元素适用于持久性单元中的所有实体、表生成器和连接表。

schema子元素被schema该元素的任何子元素 覆盖entity-mappings;实体上的或注释schema中明确指定的任何 元素,或者元素内定义的 任何或 子元素上的任何模式属性;注释或 子元素中明确指定的任何 元素;以及 注释或 子元素中明确指定的任何元素。TableSecondaryTabletablesecondary-tableentityschemaTableGeneratortable-generatorschemaJoinTablejoin-table

因此,除非您的提供商提供一些特定的扩展,否则我的建议是:

  • 如果可能的话,升级到 JPA 2.0 并使用schema子元素即可解决问题 ~or~
  • TableGenerator如果您必须坚持使用 JPA 1.0 ~或~,请使用 a
  • 如果可能的话使用别名(我不知道)。

参考

  • JPA 1.0 规范
    • 第9.1.37节“SequenceGenerator注释”
    • 第 10.1.1.1 节 “模式”
    • 第12.2.2.5节“序列生成器”
  • JPA 2.0 规范
    • 第11.1.44节“SequenceGenerator注释”
    • 第 12.2.1.1 节 “模式”
    • 第12.2.2.5节“序列生成器”