GenerationType.AUTO与hibernate中的GenerationType.IDENTITY

时间:2015-10-13 07:20:16

标签: java hibernate spring-mvc jpa database-migration

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

@Generated Value(strategy = GenerationType.IDENTITY)

在某些情况下我们需要将我们的数据库迁移到Oracle,因为它无法正常工作。如果有人知道这背后存在的实际差异以及它是如何产生的#39;工作?

3 个答案:

答案 0 :(得分:17)

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

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

Oracle允许使用“SEQUENCE”或“TABLE”策略

答案 1 :(得分:8)

引用Java Persistence/Identity and Sequencing

  

标识排序在数据库中使用特殊IDENTITY列,以允许数据库在插入行时自动为对象分配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;
    ...
}

答案 2 :(得分:0)

我正在使用JPA和Oracle 11g,适用于我的解决方案如下

package com.example.springsocial.model;

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

@Entity
@Table(name = "rol", uniqueConstraints = {
        @UniqueConstraint(columnNames = "name")
})
public class Rol {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="rol_sequence")
    @SequenceGenerator(name="rol_sequence", sequenceName="rol_sequence", allocationSize=100)
    private Long id;

    @Column(nullable = false)
    private String name;

    private Date createdAt;
    @Column(nullable = true)
    private Date updatedAt;
    @Column(nullable = true)
    private Integer createdBy;
    @Column(nullable = true)
    private Integer updatedBy;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }

    public Date getUpdatedAt() {
        return updatedAt;
    }

    public void setUpdatedAt(Date updatedAt) {
        this.updatedAt = updatedAt;
    }

    public Integer getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(Integer createdBy) {
        this.createdBy = createdBy;
    }

    public Integer getUpdatedBy() {
        return updatedBy;
    }

    public void setUpdatedBy(Integer updatedBy) {
        this.updatedBy = updatedBy;
    }
}