2015-10-13 102 views
13

目前,我们正在使用MySQL作为数据库,我们使用GenerationType.AUTO VS GenerationType.IDENTITY休眠

@Generated Value(strategy = GenerationType.IDENTITY)

它在某些情况下,我们需要把我们的数据库在那个时候它迁移到Oracle可以正常使用不能正常工作。如果有人知道背后有什么实际差异以及它是如何工作的?

+0

什么ORM供应商使用的是? –

+0

Hibernate和JPA –

回答

11

Oracle如何“正常工作”(您没有定义基本信息,如您的意思)?我没有看到AUTO对您的问题的相关性 - 只是让实现选择它想要使用的。

IDENTITY”(按照JPA javadocs和规范 - 你应该指的是什么)意思是自动增量。 Oracle中没有这样的概念,但在MySQL,SQLServer和其他一些概念中。我希望任何体面的JPA实现在尝试这样的事情时都会标记错误。

甲骨文将使“SEQUENCE”,或“TABLE”战略,然而使用

+1

是的,正如你所说,在oracle.but中没有自动增量选项,但如果我使用GenerationType.AUTO模型正在为Oracle数据库工作,因为如果我给自动JPA根据数据库自动采取生成的类型。谢谢你的澄清。 –

3

报价Java Persistence/Identity and Sequencing

身份测序使用特殊身份列数据库允许数据库在插入行时自动为对象分配一个id。许多数据库都支持标识列,例如MySQL,DB2,SQL Server,Sybase和Postgres。 Oracle不支持IDENTITY列,但可以通过使用序列对象和触发器来模拟它们。

,所以我更喜欢使用SEQUENCE代替

序列对象使用特殊的数据库对象生成的ID。序列对象仅在某些数据库(如Oracle,DB2和Postgres)中受支持。通常,SEQUENCE对象具有名称,INCREMENT和其他数据库对象设置。每次选择.NEXTVAL时,序列都会增加INCREMENT。

例子:

@Entity 
public class Employee { 
    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="EMP_SEQ") 
    @SequenceGenerator(name="EMP_SEQ", sequenceName="EMP_SEQ", allocationSize=100) 
    private long id; 
    ... 
}