2015-10-13 17 views
13

Obecnie używamy MySQL jako baza danych i używamyGenerationType.AUTO vs GenerationType.IDENTITY w hibernacji

@Generated Value(strategy = GenerationType.IDENTITY)

Jest doskonale pracuje w pewnej sytuacji musimy przenieść naszą bazę danych Oracle w tym czasie jest to nie działa prawidłowo. Jeśli ktoś wie, jaka jest obecna różnica za tym i jak działa?

+0

co ORM dostawca używasz? –

+0

Hibernate i JPA –

Odpowiedz

11

Jak to możliwe, że "działa prawidłowo" (nie definiujesz podstawowych informacji, jak to przez to rozumiesz) z Oracle? Nie widzę związku z Twoim pytaniem, które ma związek z AUTO - po prostu pozwala implementacji wybrać to, czego chce użyć.

"IDENTITY" (zgodnie z JPA javadocs i specyfikacją - do czego powinieneś się odnosić) oznacza autoinkrementacji. W Oracle nie ma takiej koncepcji, ale istnieje w MySQL, SQLServer i kilku innych. Oczekuję, że każda przyzwoita implementacja WZP zgłasza błąd, nawet próbując czegoś takiego.

Oracle pozwoli "SEQUENCE" lub "TABLE" Strategie do wykorzystania jednak

+1

tak, jak powiedziałeś, nie ma opcji Auto increment w oracle.but jeśli używam GenerationType.AUTO model pracuje dla bazy danych oracle, ponieważ jeśli dam Auto, JPA automatycznie wziął wygenerowany typ zgodnie z bazą danych. Dzięki za wyjaśnienie. –

3

Cytowanie Java Persistence/Identity and Sequencing:

Identity sekwencjonowania wykorzystuje specjalne kolumny IDENTITY w bazie danych, aby umożliwić bazy aby automatycznie przypisać identyfikator do obiektu po wstawieniu jego wiersza. Kolumny tożsamości są obsługiwane w wielu bazach danych, takich jak: MySQL, DB2, SQL Server, Sybase i Postgres. Oracle nie obsługuje kolumn IDENTITY, ale można je symulować za pomocą obiektów sekwencji i wyzwalaczy.

więc wolę używać SEKWENCJA zamiast

obiekty sekwencyjne stosowanie specjalnych obiektów bazy danych do generowania identyfikatorów. Obiekty sekwencji są obsługiwane tylko w niektórych bazach danych, takich jak Oracle, DB2 i Postgres. Zwykle obiekt SEQUENCE ma nazwę, INCREMENT i inne ustawienia obiektu bazy danych. Za każdym razem, gdy zaznaczona jest opcja .NEXTVAL, sekwencja jest zwiększana przez INCREMENT.

Przykład:

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