2013-02-05 47 views
2

我試圖使用EclipseLink 2.3保持動態實體。如果我不配置序列,只是將值賦給字段,它就可以工作。也沒有設置一個值的作品,序列與數據庫中的觸發器一起工作。但我想獲得字段的生成id(序列的下一個值)。無法通過Oracle序列獲得工作EclipseLink DynamicEntity

有一個簡單的表,有2列RD_ID和RD_NAME,我假設我應該使用Oracle序列的NativeSequence。

... 
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) 
... 

我缺少的東西,或者我應該用不同的方法來獲得序列號?

任何幫助表示讚賞。

回答

2

從錯誤中,您正在使用TABLE排序,並且您沒有SEQUENCE表。如果你想使用TABLE排序,你需要創建這個表。

您似乎想要使用Oracle SEQUENCE,因此您需要使用Session的登錄註冊NativeSequence對象。

session.getLogin()。addSequence(sequence);

您應該確保您在連接會話之前註冊序列。

+0

謝謝@詹姆斯,註冊序列的會議工作。 – user1926275