GenerationType.AUTO против GenerationType.IDENTITY в спящем режиме

В настоящее время мы используем MySQL в качестве базы данных, и мы используем

@Generated Value(strategy = GenerationType.IDENTITY)

Он отлично работает в определенных ситуациях, когда нам нужно перенести нашу базу данных в Oracle, тогда она не работает должным образом. Если кто-нибудь знает, в чем заключается реальная разница и как она работает?

5 ответов

Решение

Как это может "работать должным образом" (вы не определяете основную информацию, например, что вы подразумеваете под этим) в Oracle? Я не вижу актуальности AUTO на ваш вопрос - это просто позволяет реализации выбирать, что она хочет использовать.

"IDENTITY"(в соответствии с JPA javadocs и spec - то, на что вы должны ссылаться) означает автоинкремент. В Oracle такого понятия нет, но есть в MySQL, SQLServer и некоторых других. Я ожидаю, что любая приличная реализация JPA отметит ошибку когда даже пробую такую ​​вещь.

Oracle позволит "SEQUENCE", или же "TABLE"стратегии, которые будут использоваться однако

Цитирование http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing:

При идентификации последовательности используются специальные столбцы IDENTITY в базе данных, чтобы база данных могла автоматически назначать идентификатор объекту при вставке его строки. Столбцы идентификации поддерживаются во многих базах данных, таких как MySQL, DB2, SQL Server, Sybase и Postgres. Oracle не поддерживает столбцы IDENTITY, но их можно моделировать с помощью объектов последовательности и триггеров.

поэтому я предпочитаю использовать ПОСЛЕДОВАТЕЛЬНОСТЬ вместо

Объекты последовательности используют специальные объекты базы данных для генерации идентификаторов. Объекты последовательности поддерживаются только в некоторых базах данных, таких как 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;
    ...
}

Я использую 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;
    }
}

Если кто ищет ответ - GenerationType.IDENTITY vs GenerationType.SEQUENCE vs GenerationType.AUTOтогда это хорошая ссылка на блог

Я бы порекомендовал прочитать эту статью для быстрого и полного понимания 3 наиболее распространенных типов генерации, а именно AUTO , IDENTITY и SEQUENCE.

ОБЫЧНЫЕ ТИПЫ ГЕНЕРАЦИИ РАЗНИЦА

Другие вопросы по тегам