2010-08-04 45 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