2013-03-20 33 views
0

我用hibernate完成了我的第一个小“hello world”,在SQLServer数据库中插入了一些数据。现在我试图在不更改域类上的注释的情况下切换db,并且遇到问题。 我试图使用一种行为,让数据库上的ID处理,使用sql服务器上的标识列和oracle上的触发器序列(我想与postgres做同样的事情),所以我在我的课休眠:不同分贝上的代码相同

@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我得到了同样的错误

我想知道:有没有什么办法可以做到我是什么英?


对不起,我贴错堆栈跟踪,正确的是:

[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

很奇怪的是,Hibernate是当您使用AUTO时试图使用IDENTITY代。尝试使用Oracle9i的SEQUENCE一代。 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值和贴错堆栈跟踪,正确的错误消息是不同的... – 2013-03-20 17:08:22

+0

看看更新的答案。修改您的原始问题而不是添加更新作为答案。 – 2013-03-20 17:26:15