2017-08-14 66 views
0

我定義的實體與生成的ID值,但是當我嘗試做一個插入我得到這個錯誤:JPA:與Oracle數據庫自動遞增ID

10:33:32,202 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-8) SQL Error: 2289, SQLState: 42000 
    10:33:32,203 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-8) ORA-02289: sequence does not exist 
    10:33:32,205 ERROR [org.jboss.as.ejb3.invocation] (default task-8) WFLYEJB0034: EJB Invocation failed on component javax.ejb.EJBTransactionRolledbackException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
    Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
Caused by: java.sql.SQLSyntaxErrorException: ORA-02289: sequence does not exist 

實體:

@Entity 
@Table(name = "TYPEDEM") 
public class TypeDem { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name = "ID") 
    private long id; 
    @Column(name = "CODE") 
    private String code; 
    @Column(name = "LABEL") 
    .. 
} 

Claass:

@Override 
    public TypeDem save(TypeDem typeDem) { 
     entityManager.persist(typeDem); 
     return typeOfDemand; 
    } 

在調試,我看到id的值是空

+1

請參閱https://stackoverflow.com/questions/20603638/what-is-the-use-of-annotations-id-and-generatedvaluestrategy-generationtype –

+1

不,Oracle沒有「自動增量」支持,所以不,你不能使用IDENTITY策略。然而,我會期待你的JPA提供者告訴你,而不是僅僅使用NULL!也許你應該提出一個錯誤。 –

+1

你想用來生成id的序列是什麼。是否在您的數據庫架構 –

回答

0

身份發電機

它是在Sybase使用,我的SQL,MS SQL服務器,DB2和HypersonicSQL支持ID列。返回的ID的類型是short,int或long。

身份類型(包括在SQL:2003標準)由支持:

SQL服務器 的MySQL(AUTO_INCREMENT) DB2 HSQLDB 身份發生器允許的整數/ BIGINT列是自動遞增一經請求。增量過程發生在當前正在運行的事務之外,因此回滾可能最終丟棄已分配的值(可能會發生值間隙)。

對於甲骨文,使用下面的代碼@GeneratedValue(策略= GenerationType.AUTO)

​​
+0

Thx中創建,但是當我使用AUTO時,我得到了相同的錯誤 – user1814879

0

你的解決方案是正確的。

唯一的問題似乎是hibernate.hbm2ddl.auto未設置爲更新,請使用更新。使用create或create-drop時要非常小心。

Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
Caused by: java.sql.SQLSyntaxErrorException: ORA-02289: sequence does not exist 

這清楚地表明序列在數據庫中缺失。

+1

他的「解決方案」不正確。他選擇了IDENTITY策略。 IDENTITY表示一個「標識列」......用RDBMS表示這是AUTO_INCREMENT或SERIAL列類型。 Oracle沒有這樣的支持。 JPA規範還說「IDENTITY不能跨所有數據存儲區移植」。如果他想使用序列,他應該選擇SEQUENCE策略 –