Hibernate: gleichen Code auf verschiedenen db

Ich habe meine erste kleine "Hallo Welt" mit Hibernate gemacht und einige data in meinen SQLserver db eingefügt. Jetzt versuche ich, db ohne Änderung die Annotation auf meinem Domain-classn zu wechseln, und ich habe Probleme. Ich habe versucht, ein Verhalten zu verwenden, das die Handhabung der ID auf dem db, die Verwendung einer Identitätsspalte auf dem SQL server und eine Sequenz mit einem Auslöser auf oracle (und ich dachte, das gleiche mit Postgres zu tun), so dass ich deklariert in meiner class

@Id @Column(name = "ID") @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return this.id; } 

diese Arbeit gut auf SQLserver, aber es gibt mir diesen Fehler auf Oracle:

 [main] ERROR org.hibernate.util.JDBCExceptionReporter - ORA-02289: sequence does not exist org.hibernate.exception.SQLGrammarException: could not get next sequence value at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.id.SequenceGenerator.generateHolder(SequenceGenerator.java:132) at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:105) at org.hibernate.event.def.AbstractSaveEventlistner.saveWithGeneratedId(AbstractSaveEventlistner.java:121) at org.hibernate.event.def.DefaultSaveOrUpdateEventlistner.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventlistner.java:210) at org.hibernate.event.def.DefaultSaveEventlistner.saveWithGeneratedOrRequestedId(DefaultSaveEventlistner.java:56) at org.hibernate.event.def.DefaultSaveOrUpdateEventlistner.entityIsTransient(DefaultSaveOrUpdateEventlistner.java:195) at org.hibernate.event.def.DefaultSaveEventlistner.performSaveOrUpdate(DefaultSaveEventlistner.java:50) at org.hibernate.event.def.DefaultSaveOrUpdateEventlistner.onSaveOrUpdate(DefaultSaveOrUpdateEventlistner.java:93) at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697) at test.Main.main(Main.java:23) Caused by: java.sql.SQLSyntaxErrorException: ORA-02289: sequence does not exist at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:91) at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206) 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:1491) at org.hibernate.id.SequenceGenerator.generateHolder(SequenceGenerator.java:112) ... 11 more 

Beachten Sie, dass auch mit Strategie = GenerationType.SEQUENCE bekam ich den gleichen Fehler

Ich habe mich gefragt: Gibt es irgendeine Möglichkeit zu tun, was ich versuche?


Sorry, ich habe die falsche stackTrace, die richtige ist:

 [main] ERROR org.hibernate.util.JDBCExceptionReporter - ORA-02289: sequence does not exist org.hibernate.exception.SQLGrammarException: could not get next sequence value at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.id.SequenceGenerator.generateHolder(SequenceGenerator.java:132) at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:105) at org.hibernate.event.def.AbstractSaveEventlistner.saveWithGeneratedId(AbstractSaveEventlistner.java:121) at org.hibernate.event.def.DefaultSaveOrUpdateEventlistner.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventlistner.java:210) at org.hibernate.event.def.DefaultSaveEventlistner.saveWithGeneratedOrRequestedId(DefaultSaveEventlistner.java:56) at org.hibernate.event.def.DefaultSaveOrUpdateEventlistner.entityIsTransient(DefaultSaveOrUpdateEventlistner.java:195) at org.hibernate.event.def.DefaultSaveEventlistner.performSaveOrUpdate(DefaultSaveEventlistner.java:50) at org.hibernate.event.def.DefaultSaveOrUpdateEventlistner.onSaveOrUpdate(DefaultSaveOrUpdateEventlistner.java:93) at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697) at test.Main.main(Main.java:23) Caused by: java.sql.SQLSyntaxErrorException: ORA-02289: sequence does not exist at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:91) at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206) 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:1491) at org.hibernate.id.SequenceGenerator.generateHolder(SequenceGenerator.java:112) ... 11 more 

Beachten Sie, dass auch mit Strategie = GenerationType.SEQUENCE bekam ich den gleichen Fehler

Es ist seltsam, dass Hibernate versucht, IDENTITY Generation zu verwenden, wenn Sie AUTO . Versuchen Sie mit SEQUENCE Generation für Oracle9i. Hier ist ein Beispiel in der JBoss Dokumentation .

 @Entity @javax.persistence.SequenceGenerator( name="SEQ_STORE", sequenceName="my_sequence" ) public class Store implements Serializable { private Long id; @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE") public Long getId() { return id; } } 

Werfen Sie einen Blick auf diese Seite für eine dokumentierte list der unterstützten Generierungstypen auf verschiedenen DB-Dialekten.