【问题标题】:Sequence doesnot exist error while accessing sequence from another schema of same DB从同一数据库的另一个模式访问序列时,序列不存在错误
【发布时间】:2020-08-26 21:13:32
【问题描述】:

我的数据库中有两个模式。 一个是“admin”模式,另一个是“user”模式。

我在“admin”模式中创建了一个序列。我的 weblogic ejb 应用程序从 weblogic-cmp-jar.xml 文件中读取数据库详细信息,例如数据源名称、表名称、列、模式名称。在数据源名称中,我为“用户”模式提供了 DS。我需要我的应用程序正确读取 DB 属性并填充 ejb bean。

但是,我在更新数据库中的记录时收到以下错误(序列不存在):

> WARN - com.abc.xyz.SomeHandlerEJB_vhem4v_Impl - [ACTIVE]
> ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'
> - update
>         javax.ejb.TransactionRolledbackLocalException: EJB Exception:
>         at weblogic.ejb.container.internal.EJBRuntimeUtils.asTxRollbackLocalException(EJBRuntimeUtils.java:151)
>         at weblogic.ejb.container.internal.BaseLocalObject.handleSystemException(BaseLocalObject.java:471)
>         at weblogic.ejb.container.internal.BaseEJBLocalHome.handleSystemException(BaseEJBLocalHome.java:102)
>         at weblogic.ejb.container.internal.EntityEJBLocalHome.create(EntityEJBLocalHome.java:171)
>         at weblogic.ejb.container.internal.EntityEJBLocalHome.create(EntityEJBLocalHome.java:133)
    Caused by: javax.ejb.EJBException: ORA-02289: sequence does not exist

        at weblogic.ejb.container.cmp.rdbms.RDBMSPersistenceManager.execGenKeyQuery(RDBMSPersistenceManager.java:4434)
        at weblogic.ejb.container.cmp.rdbms.RDBMSPersistenceManager.getNextGenKeyPreFetch(RDBMSPersistenceManager.java:4356)
        at weblogic.ejb.container.cmp.rdbms.RDBMSPersistenceManager.getNextSequenceKey(RDBMSPersistenceManager.java:4309)
        at 

这是我的 weblogic-cmp-jar.xml 文件的内容:

    <weblogic-rdbms-bean>
        <ejb-name>MyEJB</ejb-name>
        <data-source-name>jdbc/MyDS</data-source-name>
        <table-map>
            <table-name>my_table</table-name>
            <field-map>
                <cmp-field>messageId</cmp-field>
                <dbms-column>messageId</dbms-column>
            </field-map>
            ----------
            ----------
        </table-map>
        <automatic-key-generation>
            <generator-type>Oracle</generator-type>
            <generator-name>SEQ_MYSEQNAME</generator-name>
            <key-cache-size>1</key-cache-size>
        </automatic-key-generation>
    </weblogic-rdbms-bean>

以下是我观察到的行为:

    <generator-name>SEQ_MYSEQNAME</generator-name>        // does not work
    <generator-name>ADMIN.SEQ_MYSEQNAME</generator-name>  // works fine

如果我得到以下结果,则在 --user-- 模式的数据库中:

    select * from user_sequences // It does not show anything.
    select * from ALL_SEQUENCES  // It displays the sequence names.

我只想使用没有序列所有者的序列名称。

我正在使用以下软件堆栈:

  1. Weblogic 12c
  2. Oracle DB 12g
  3. Java 1.8

【问题讨论】:

  • 在用户模式中创建指向管理模式中序列的同义词怎么样?你的情况允许吗?

标签: java oracle ejb weblogic weblogic12c


【解决方案1】:

我觉得在您的 USER Schema 中添加下面的 SYNONYM 可以完成工作。

CREATE OR REPLACE EDITIONABLE SYNONYM SEQ_MYSEQNAME FOR "ADMIN"."SEQ_MYSEQNAME";

除了用户架构中的这一添加之外,Weblogic / 应用程序配置中不需要进行其他更改。

【讨论】:

  • 同义词已在用户架构中创建:CREATE OR REPLACE SYNONYM "USER"."USER_DEF_SEQ" FOR "ADMIN"."SEQ_MYSEQNAME";
  • EDITONABLE 没有被使用过。。我不知道。
  • 我使用的是 PRIVATE 同义词而不是 global/public。
【解决方案2】:

就我而言,SYNONYM SEQ_MYSEQNAME FOR "ADMIN"."SEQ_MYSEQNAME" 已经在 DB 中创建。我们删除了现有的 SYNONYM 并使用适当的权限再次重新创建了相同的 SYNONYM。这解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    相关资源
    最近更新 更多