2013-03-20 3 views
0

Я сделал свой первый маленький «мир привет» с hibernate, вставив некоторые данные в свой SQLServer db. Теперь я пытаюсь переключить db без изменения аннотации на классы домена, и у меня возникают проблемы. Я попытался использовать поведение, позволяющее обрабатывать идентификатор на db, используя столбец идентификаторов на сервере sql и последовательность с триггером на oracle (и я думал сделать то же самое с postgres), поэтому я заявил в своем классеHibernate: тот же код на разных db

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

эта работа хорошо на SQLServer, но это дает мне эту ошибку на 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.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121) 
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: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 

к сведению, что также со стратегией = GenerationType.SEQUENCE я получил ту же ошибку

Мне было интересно: есть ли способ сделать то, что я tr инь?


К сожалению, я отправил неправильный StackTrace, правильным является:

[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.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121) 
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: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 

отметить, что также со стратегией = GenerationType.SEQUENCE я получил ту же ошибку

ответ

1

Это странно, что спящий режим является пытаясь использовать IDENTITY поколения, когда вы используете AUTO. Попробуйте использовать генератор SEQUENCE для Oracle9i. Here's an example given in JBoss documentation.

@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; } 
} 

Take a look at this page for documented list of supported generation types on different DB dialects.

+0

извините, я пытался изменить значение GenerationType и отправил неправильный StackTrace, правильное сообщение об ошибке отличается .. –

+0

Обратите внимание на обновление ответа. Измените исходный вопрос вместо добавления обновления в качестве ответа. –

Смежные вопросы