GenerationType.AUTO与hibernate中的GenerationType.IDENTITY

set*_*pan 22 java hibernate jpa spring-mvc database-migration

目前我们使用mysql作为数据库,我们使用

@Generated Value(strategy = GenerationType.IDENTITY)

它在某些情况下完美地工作,我们需要将我们的数据库迁移到Oracle,那时它无法正常工作.如果有人知道这背后存在的实际差异以及它是如何工作的?

Nei*_*ton 20

如何使用Oracle"正常工作"(您没有像您所说的那样定义基本信息)?我没有看到与AUTO您的问题的相关性- 只是让实现选择它想要使用的内容.

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

但是,Oracle会允许使用" SEQUENCE"或" TABLE"策略

  • 是的,正如你所说oracle中没有自动增量选项.但是如果我使用GenerationType.AUTO模型正在为oracle数据库工作,因为如果我给Auto,JPA会根据数据库自动获取生成的类型.谢谢你的澄清. (2认同)
  • 嗨,我认为回答这个问题比取笑那个问问题的人更好。没有像 auto_increment 这样的概念......那么解释一下identity的含义以及为什么它不能与Oracle一起使用,对吧? (2认同)

Ahm*_*rdi 12

引用Java持久性/身份和排序:

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

所以我更喜欢使用序列代替

序列对象使用特殊的数据库对象来生成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;
    ...
}
Run Code Online (Sandbox Code Playgroud)