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)
我可以尝试的解决方法:
在 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
因此,除非您的提供商提供一些特定的扩展,否则我的建议是:
schema子元素即可解决问题 ~or~TableGenerator如果您必须坚持使用 JPA 1.0 ~或~,请使用 a| 归档时间: |
|
| 查看次数: |
6558 次 |
| 最近记录: |