出于安全原因,我们的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"/>
我可以尝试的解决方法:
答案 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
元素中明确指定的元素Table
或SecondaryTable
注释 在实体或任何schema
属性上 在任何table
或secondary-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
元素 在Table
或SecondaryTable
中 实体或任何架构的注释 属于任何table
或 已定义secondary-table
子元素 在entity
元素内;任何 明确指定了schema
元素 在TableGenerator
注释或table-generator
子元素;和任何 明确指定了schema
元素 在JoinTable
注释或join-table
子元素。
因此,除非您的提供商提供某些特定扩展,否则我的建议是:
schema
子元素可以做到〜或〜TableGenerator
答案 1 :(得分:0)
原谅我问了一个显而易见的问题,但你已经将序列的选择权限授予试图从中选择的用户,对吗?