2010-08-04 47 views
2

事實證明,以下示例在使用mysql 5.x時有效,但在使用oracle 10g數據庫時不會發生。定義獨立於數據庫的JPA對象uid

有沒有辦法定義獨立於數據庫技術的唯一標識符字段?

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name="id") 
private long id; 

我在休眠測試這一點,並使用Oracle時,僅出現以下異常:

org.hibernate.MappingException: Dialect does not support identity key generation 
+1

爲什麼不使用'GenerationType.AUTO',以便供應商根據數據庫選擇最佳策略? – 2010-08-04 16:27:23

回答

0

我一直在使用GenerationType.AUTO和它似乎是更好的選擇研究。它允許JPA實現爲您正在使用的數據存儲系統選擇最適合的選項。

+0

GenerationType.AUTO的問題在於提供程序需要具有數據庫權限才能創建表或序列(如果它選擇這兩種策略之一的話)。通常這是一項限於DBA的特權操作。在這種情況下,您需要確保在AUTO策略能夠運行之前創建持久性資源。 – 2010-08-09 16:36:15

4

使用數據庫表生成標識符的可移植的方式。

使用一個表來生成標識符的最簡單的方法是指定TABLE作爲生成策略:

@Id 
@GeneratedValue(strategy=GenerationType.TABLE) 
@Column(name="id") 
private long id; 

服務提供者將創建默認的表,如果你使用的架構生成;如果沒有,你必須指定一個現有的表:

@TableGenerator(name="InvTab", 
    table="ID_GEN", 
    pkColumnName="ID_NAME", 
    valueColumnName="ID_VAL", 
    pkColumnValue="INV_GEN") 
@Id 
@GeneratedValue(generator="InvTab") 
@Column(name="id") 
private long id; 

http://www.oracle.com/technology/products/ias/toplink/jpa/howto/id-generation.html#table