Enhancement 246 : ENHANCEMENT - Support Oracle trigger to supply ID value
Priority 
High
Reported Version 
 
Logged By 
wstone
Status 
New
Fixed Version 
 
Assigned To 
 
Product 
Ebean - core
Duplicate Of 
 
Created 
16/03/2010
Updated 
16/03/2010
Type 
Enhancement
 
Attachments 
No attachments

when I use 2.3,it work ok ,not throw this exception.when i upgrade to 2.4,same code will throw this exception:
javax.persistence.PersistenceException: Error getting sequence nextval
at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.getMoreIds(SequenceIdGenerator.java:204)
at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.loadMoreIds(SequenceIdGenerator.java:157)
at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.nextId(SequenceIdGenerator.java:114)
at com.avaje.ebean.server.deploy.BeanDescriptor.nextId(BeanDescriptor.java:988)
at com.avaje.ebean.server.persist.DefaultPersister.setIdGenValue(DefaultPersister.java:968)
at com.avaje.ebean.server.persist.DefaultPersister.insert(DefaultPersister.java:359)
at com.avaje.ebean.server.persist.DefaultPersister.saveVanillaInsert(DefaultPersister.java:337)
at com.avaje.ebean.server.persist.DefaultPersister.saveVanillaRecurse(DefaultPersister.java:321)
at com.avaje.ebean.server.persist.DefaultPersister.saveRecurse(DefaultPersister.java:268)
at com.avaje.ebean.server.persist.DefaultPersister.save(DefaultPersister.java:259)
at com.avaje.ebean.server.core.DefaultServer.save(DefaultServer.java:1448)
at com.avaje.ebean.server.core.DefaultServer.save(DefaultServer.java:1438)

my id define:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "LOG_ID")
private BigDecimal logId;

 
Rob 17 Mar 03:20
So what is the underlying exception ?

You have not shown the underlying exception ?

Rob 17 Mar 09:40
To clarify ...

There is more in the stack trace that you have not posted here... unfortunately it's the bit that tells us what the underlying error was.

Can you post that up?

Thanks.

wstone 18 Mar 03:11
shown the underlying exception

javax.persistence.PersistenceException: Error getting sequence nextval
at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.getMoreIds(SequenceIdGenerator.java:204)
at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.loadMoreIds(SequenceIdGenerator.java:157)
at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.nextId(SequenceIdGenerator.java:114)
at com.avaje.ebean.server.deploy.BeanDescriptor.nextId(BeanDescriptor.java:988)
at com.avaje.ebean.server.persist.DefaultPersister.setIdGenValue(DefaultPersister.java:968)
at com.avaje.ebean.server.persist.DefaultPersister.insert(DefaultPersister.java:359)
at com.avaje.ebean.server.persist.DefaultPersister.saveVanillaInsert(DefaultPersister.java:337)
at com.avaje.ebean.server.persist.DefaultPersister.saveVanillaRecurse(DefaultPersister.java:321)
at com.avaje.ebean.server.persist.DefaultPersister.saveRecurse(DefaultPersister.java:268)
at com.avaje.ebean.server.persist.DefaultPersister.save(DefaultPersister.java:259)
at com.avaje.ebean.server.core.DefaultServer.save(DefaultServer.java:1448)
at com.avaje.ebean.server.core.DefaultServer.save(DefaultServer.java:1438)
at wjw.ebean.test.TestA.saveFindDelete(TestA.java:65)
at wjw.ebean.test.TestA.main(TestA.java:95)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:110)
Caused by: java.sql.SQLException: ORA-02289: ????????????????????????

at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:74)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:131)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:204)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1034)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:791)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:866)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1186)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3387)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3431)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1203)
at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.getMoreIds(SequenceIdGenerator.java:185)
... 18 more

Rob 18 Mar 21:40
So ...

So the underlying exception is ORA-02289: sequence does not exist

.. so does the sequence exist?
What is the sequence name is is complaining about?

Ta.

wstone 21 Mar 08:55
For the ID Field, I would like to own assignment, change how to do?

my id define:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "LOG_ID")
private BigDecimal logId;

Rob 21 Mar 10:49
You are changing the subject.

You are changing the subject.

This bug is to resolve a ORA-02289: sequence does not exist error.

No other issue will be looked at here. So if you don't answer my question or provide a test case I will close this (as not a bug).

Questions are for Forums and the Google group.

Thanks.

wstone 22 Mar 01:07
this test case

package wjw.ebean.test;

import com.avaje.ebean.EbeanServer;
import junit.framework.TestCase;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import wjw.ebean.entity.Log4jEdi;

import java.math.BigDecimal;

public class TestMain extends TestCase {
ApplicationContext appContext;
EbeanServer ebeanServer;

public void setUp() throws Exception {
super.setUp();

appContext = new FileSystemXmlApplicationContext("./conf/spring-ebean.xml");
ebeanServer = (EbeanServer) appContext.getBean("ebeanServer");
}

public void tearDown() throws Exception {
super.tearDown();
}

public void testGenerationType() throws InterruptedException {
Log4jEdi lOG4JEDI = ebeanServer.createEntityBean(Log4jEdi.class);
lOG4JEDI.setLogId(new BigDecimal(0));
lOG4JEDI.setLogClassname("com.hr.rest.ihs.orderbill");
lOG4JEDI.setLogLevel("INFO");
lOG4JEDI.setLogMsg("java.util.GregorianCalendar");
lOG4JEDI.setLogThread("InsertOrderBill2OMS");
lOG4JEDI.setLogDate(new java.util.Date());

ebeanServer.save(lOG4JEDI);

java.util.concurrent.TimeUnit.SECONDS.sleep(10);

lOG4JEDI.setLogDate(new java.util.Date());
ebeanServer.save(lOG4JEDI);
}
}

wstone 22 Mar 01:09
There, the JPA Entity Bean

package wjw.ebean.entity;

import com.avaje.ebean.annotation.Sql;
import com.avaje.ebean.annotation.SqlSelect;

import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

@Entity
@Table(name = "LOG4J_EDI")
public class Log4jEdi implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "LOG_ID")
private BigDecimal logId;

@Basic(optional = false)
@Column(name = "LOG_DATE", insertable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date logDate;

@Column(name = "LOG_LEVEL")
private String logLevel;

@Column(name = "LOG_THREAD")
private String logThread;

@Column(name = "LOG_CLASSNAME")
private String logClassname;

@Basic(optional = false)
@Lob
@Column(name = "LOG_MSG")
private String logMsg;

public Log4jEdi() {
}

public Log4jEdi(BigDecimal logId) {
this.logId = logId;
}

public Log4jEdi(BigDecimal logId, Date logDate, String logMsg) {
this.logId = logId;
this.logDate = logDate;
this.logMsg = logMsg;
}

public BigDecimal getLogId() {
return logId;
}

public void setLogId(BigDecimal logId) {
this.logId = logId;
}

public Date getLogDate() {
return logDate;
}

public void setLogDate(Date logDate) {
this.logDate = logDate;
}

public String getLogLevel() {
return logLevel;
}

public void setLogLevel(String logLevel) {
this.logLevel = logLevel;
}

public String getLogThread() {
return logThread;
}

public void setLogThread(String logThread) {
this.logThread = logThread;
}

public String getLogClassname() {
return logClassname;
}

public void setLogClassname(String logClassname) {
this.logClassname = logClassname;
}

public String getLogMsg() {
return logMsg;
}

public void setLogMsg(String logMsg) {
this.logMsg = logMsg;
}

@Override
public int hashCode() {
int hash = 0;
hash += (logId != null ? logId.hashCode() : 0);
return hash;
}

@Override
public boolean equals(Object object) {
if (!(object instanceof Log4jEdi)) {
return false;
}
Log4jEdi other = (Log4jEdi) object;
if ((this.logId == null && other.logId != null) || (this.logId != null && !this.logId.equals(other.logId))) {
return false;
}
return true;
}

@Override
public String toString() {
return "\nLog4jEdi{" +
"logId=" + logId +
", logDate=" + logDate +
", logLevel='" + logLevel + '\'' +
", logThread='" + logThread + '\'' +
", logClassname='" + logClassname + '\'' +
", logMsg='" + logMsg + '\'' +
"}";
}

}

Rob 31 Mar 03:46
Hmm...

Ok, as I see it this is an Enhancement request to support the scenario where you want to use a trigger to supply the primary key value rather than having it come from Ebean.

Does that sound correct?

wstone 31 Mar 16:47
Yes, the actual situation there are many such needs, I sincerely hope Ebean to grow rapidly

Yes, the actual situation there are many such needs, I sincerely hope Ebean to grow rapidly

woResponse

Upload a file