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

时间:2010-10-14 22:06:52

标签: java oracle jpa persistence

出于安全原因,我们的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>

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

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"/>

我可以尝试的解决方法:

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

2 个答案:

答案 0 :(得分: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   元素中明确指定的元素   TableSecondaryTable注释   在实体或任何schema属性上   在任何tablesecondary-table   entity中定义的子元素   元件;任何schema元素   明确指定在   TableGenerator注释或   table-generator子元素;任何   在中明确指定的schema元素   一个SequenceGenerator注释或   sequence-generator子元素;任何   明确指定了schema元素   在JoinTable注释或   join-table子元素;和任何   在中明确指定的schema元素   一个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子元素可以做到〜或〜
  • 如果您必须坚持使用JPA 1.0~或〜
  • ,请使用TableGenerator
  • 如果可能,请使用别名(我不知道)。

参考

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

答案 1 :(得分:0)

原谅我问了一个显而易见的问题,但你已经将序列的选择权限授予试图从中选择的用户,对吗?