I have an issue with getting a sequence value from Hibernate. When it runs the sequence query Oracle 10g says it doesn't exist, but if I turn on the print sql option and run the same query in the 10g web interface it works fine. Also I checked the sequence in the object browser and it looks fine. The user is set to have DBA privileges.
My code:
Hibernate 3.3.1GA
hibernate.cfg.xml
Code:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
<property name="connection.username">hibernate</property>
<property name="connection.password">password</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">10</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">none</property>
<mapping class="com.ex.kpi.model.domain.ReportGroup" />
<mapping class="com.ex.kpi.model.domain.FormField" />
<mapping class="com.ex.kpi.model.domain.EntityType" />
<mapping class="com.ex.kpi.model.domain.EntityValue" />
<mapping class="com.ex.kpi.model.domain.Report" />
<mapping class="com.ex.kpi.model.domain.ProcessedReport" />
<mapping class="com.ex.kpi.model.domain.Audit" />
<mapping class="com.ex.kpi.model.domain.ReportComment" />
<mapping class="com.ex.kpi.model.domain.ProcessedReportData" />
<mapping class="com.ex.kpi.model.domain.UserInputData" />
<mapping class="com.ex.kpi.model.domain.ProcessedReportField" />
</session-factory>
</hibernate-configuration>
Test Case:
Code:
public void testReportCreation() {
Report report = new Report() ;
report.setName("Test Report 1") ;
report.setType("editable") ;
report.setTimestamp(new Date()) ;
Session session = super.getSession() ;
session.save(report) ;
session.flush() ;
session.close() ;
}
SQL:
select KPI_REPORT_ID.nextval from dual
Exception:
Code:
org.hibernate.exception.SQLGrammarException: could not get next sequence value
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:119)
at org.hibernate.id.SequenceHiLoGenerator.generate(SequenceHiLoGenerator.java:81)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:122)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:562)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:550)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:546)
at com.exelon.kpi.test.dao.ReportDAOTest.testReportCreation(ReportDAOTest.java:40)
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 junit.framework.TestCase.runTest(TestCase.java:164)
at junit.framework.TestCase.runBare(TestCase.java:130)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.sql.SQLException: ORA-02289: sequence does not exist
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:219)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:813)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1049)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:854)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1154)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3370)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3415)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:98)
... 27 more
Class File:
Code:
@Entity
@Table(name="KPI_REPORT")
public class Report {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="KPI_REPORT_ID")
@SequenceGenerator(name="KPI_REPORT_ID", sequenceName="KPI_REPORT_ID")
private Integer id ;
@Column(name="NAME")
private String name ;
@Column(name="TYPE")
private String type ;
@Column(name="TIMESTAMP")
private Date timestamp ;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="REPORT_GROUP_ID")
private ReportGroup reportGroup ;
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="REPORT_ID")
private Collection<ProcessedReport> processedReports ;
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="REPORT_ID")
private Collection<FormField> formFields ;
public Collection<FormField> getFormFields() {
return formFields;
}
public void setFormFields(Collection<FormField> formFields) {
this.formFields = formFields;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Date getTimestamp() {
return timestamp;
}
public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}
public Collection<ProcessedReport> getProcessedReports() {
return processedReports;
}
public void setProcessedReports(Collection<ProcessedReport> processedReports) {
this.processedReports = processedReports;
}
public ReportGroup getReportGroup() {
return reportGroup;
}
public void setReportGroup(ReportGroup reportGroup) {
this.reportGroup = reportGroup;
}
}
Thanks In Advance[/code]