生成类型.AUTO 与生成类型.处于休眠状态

2022-09-01 02:07:35

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

@Generated Value(strategy = GenerationType.IDENTITY)

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


答案 1

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

"IDENTITY“(根据 JPA javadocs 和 spec - 你应该指的是什么)表示自动增量。Oracle中没有这样的概念,但在MySQL,SQLServer和其他一些组织中却有。我希望任何像样的JPA实现在尝试这样的事情时都能标记错误。

但是,Oracle将允许使用“”或“”策略SEQUENCETABLE


答案 2

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

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

所以我更喜欢使用SEQUENCE代替

序列对象使用特殊的数据库对象来生成 id。序列对象仅在某些数据库中受支持,例如 Oracle、DB2 和 Postgres。通常,SEQUENCE 对象具有名称、增量和其他数据库对象设置。每次 .选择 NEXTVAL,序列按增量递增。

例:

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

推荐