oracle - 无法使用 Oracle 序列获取 EclipseLink DynamicEntity 的工作

标签 oracle jpa orm eclipselink sequence

我正在尝试使用 EclipseLink 2.3 保留动态实体。如果我没有配置序列,只是为字段分配一个值,它就可以工作。另外,不设置值也有效,序列正在与数据库中的触发器一起使用。但我想获取生成的字段 ID(序列的下一个值)。

有一个包含 2 列 RD_ID 和 RD_NAME 的简单表,我假设我应该使用 NativeSequence 作为 Oracle 序列。

...
Sequence seq = new NativeSequence("RD_SEQ", 1);
dynamicTypeBuilder.configureSequencing(seq, "RD_SEQ", "RD_ID");
...
DynamicEntity entity;
entity = (DynamicEntity) classDesc.getInstantiationPolicy().buildNewInstance();
// entity.set("rdId", new BigDecimal(1));
entity.set("rdName", "some text");

...
getEntityManager().persist(entity);
System.out.println(entity.get("rdId"));

抛出异常:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
Error Code: 942
Call: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
    bind => [2 parameters bound]
Query: DataModifyQuery(name="SEQUENCE" sql="UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?")
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:840)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:906)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:592)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:535)
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1717)
    at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:253)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeNoSelectCall(DatasourceCallQueryMechanism.java:236)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeNoSelect(DatasourceCallQueryMechanism.java:216)
    at org.eclipse.persistence.queries.DataModifyQuery.executeDatabaseQuery(DataModifyQuery.java:85)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:844)
    at org.eclipse.persistence.internal.sessions.AbstractSession.internalExecuteQuery(AbstractSession.java:2831)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1516)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1498)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1463)
    at org.eclipse.persistence.sequencing.QuerySequence.update(QuerySequence.java:340)
    at org.eclipse.persistence.sequencing.QuerySequence.updateAndSelectSequence(QuerySequence.java:277)
    at org.eclipse.persistence.sequencing.StandardSequence.getGeneratedVector(StandardSequence.java:71)
    at org.eclipse.persistence.sequencing.DefaultSequence.getGeneratedVector(DefaultSequence.java:163)
    at org.eclipse.persistence.sequencing.Sequence.getGeneratedVector(Sequence.java:257)
    at org.eclipse.persistence.internal.sequencing.SequencingManager$Preallocation_Transaction_NoAccessor_State.getNextValue(SequencingManager.java:468)
    at org.eclipse.persistence.internal.sequencing.SequencingManager.getNextValue(SequencingManager.java:1067)
    at org.eclipse.persistence.internal.sequencing.ClientSessionSequencing.getNextValue(ClientSessionSequencing.java:70)
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.assignSequenceNumber(ObjectBuilder.java:349)
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.assignSequenceNumber(ObjectBuilder.java:308)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.assignSequenceNumber(UnitOfWorkImpl.java:465)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNotRegisteredNewObjectForPersist(UnitOfWorkImpl.java:4231)
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.registerNotRegisteredNewObjectForPersist(RepeatableWriteUnitOfWork.java:513)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4176)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:440)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.persist(EntityManagerWrapper.java:269)
...

我是否遗漏了什么或者我应该使用不同的方法来获取序列号?

感谢任何帮助。

最佳答案

从错误来看,您正在使用 TABLE 排序,并且没有 SEQUENCE 表。如果您希望使用 TABLE 排序,则需要创建此表。

您似乎想要使用 Oracle SEQUENCE,因此您需要使用 Session 的登录名注册 NativeSequence 对象。

session.getLogin().addSequence(sequence);

您应该确保在连接 session 之前注册序列。

关于oracle - 无法使用 Oracle 序列获取 EclipseLink DynamicEntity 的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14706793/

相关文章:

java - 如何才能完全禁用Spring Boot数据库相关配置

java - JPA 如何从另一个表中检索值?

java - 如何为 EntityManagerFactory 设置 Hibernate 拦截器

java - JPA QL 用于选择多对多关系的非拥有方?

oracle - 在哪里可以查询oracle数据库的大小写敏感度?

java - Flyway:迁移大量脚本时性能缓慢

xml - 在内部,Postgres 如何存储 XML 数据?

c# - ROWNUM 的 OracleType 是什么

java - 连接丢失后自动重新连接 JPA EntityManager

python - 在Django中,我可以在创建对象时指定数据库吗?