【问题标题】:How do you set the schema name for sequences at deploy time when using JPA?使用 JPA 时如何在部署时设置序列的模式名称?
【发布时间】:2011-04-25 16:15:36
【问题描述】:

出于安全原因,我们的 oracle 数据库对象通常属于与登录用户不同的模式。例如。表在 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>

这对表格很有效,但我找不到序列的等价物。它尝试使用没有模式名称的序列,然后出现异常:

2010-10-14 03:04:05,423:DEBUG 无法获取下一个序列值 [从双重选择 xx_SEQ.nextval] - org.hibernate.util.JDBCExceptionReporter java.sql.SQLException: ORA-02289: 序列不存在 在 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)

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

<sequence-generator name="xx_SEQ_GEN"
sequence-name="xx_core.xx_SEQ"/>

我可以尝试的解决方法:

  • 为用户架构中的序列创建一个数据库 SYNONYM。
  • 停止使用序列并使用其他方式生成 ID。

【问题讨论】:

    标签: java oracle jpa persistence


    【解决方案1】:

    在 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 中明确指定的元素 TableSecondaryTable 注释 在实体或任何schema 属性上 在任何tablesecondary-tableentity 中定义的子元素 元素;任何schema 元素 在 a 中明确指定 TableGenerator 注释或 table-generator 子元素;任何 明确指定的模式元素 SequenceGenerator 注释或 sequence-generator 子元素;任何 schema 元素明确指定 在 JoinTable 注释中或 join-table 子元素;和任何 明确指定的模式元素 CollectionTable 注释或 collection-table 子元素。

    来自 JPA 1.0 规范:

    10.1.1.1 架构

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

    schema 子元素被覆盖 通过任何schema 的子元素 entity-mappings 元素;任何 schema 元素明确指定 在TableSecondaryTable 实体或任何模式上的注释 任何table 的属性或 secondary-table 子元素已定义 在entity 元素内;任何 schema 元素明确指定 在 TableGenerator 注释中或 table-generator 子元素;和任何 schema 元素明确指定 在 JoinTable 注释中或 join-table 子元素。

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

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

    参考文献

    • 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 节“序列生成器”

    【讨论】:

    • 哇,谢谢帕斯卡!我坚持使用 JPA1,我不喜欢表生成器的想法,但幸运的是,我设法在 oracle 中为用户创建了一个同义词,例如。 create synonym xx_app_yy.xx_SEQ for xx_core.xx_SEQ;
    【解决方案2】:

    请原谅我问的很明显,但是您已将序列的选择权限授予尝试从中选择的用户,对吧?

    【讨论】:

    • 是的。它试图运行的查询是错误的,如上所示“从双重选择xx_SEQ.nextval”应该是“从双重选择xx_core.xx_SEQ.nextval”
    猜你喜欢
    • 2011-02-13
    • 2012-05-19
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多