2012-08-03 9 views
11

Mam problem ze znalezieniem dokładnego wyjaśnienia @GeneratedValue i różnych strategii dotyczących tego, co dzieje się z punktu widzenia bazy danych.Hibernate: podsumowanie jak działa @GeneratedValue

Czy baza danych będzie zawsze sprawdzana i zwrócona zostanie ostatnia dostępna wartość? co się stanie, jeśli 2 różne procesy (różne aplikacje Hibernate) będą miały dostęp do tej samej tabeli w tym samym czasie? w szczególności z wartościami i sekwencjami auto numerycznymi

Odpowiedz

20

Zakładam, że odwołujesz się do wartości JPA @GeneratedValue.

Adnotacja @GeneratedValue informuje ORM, jak określić wartość tego pola.

Na przykład:

@Id 
@GeneratedValue(strategy=SEQUENCE, generator="CUST_SEQ") 
@Column(name="CUST_ID") 
public Long getId() { return id; } 

Example 2: 

@Id 
@GeneratedValue(strategy=TABLE, generator="CUST_GEN") 
@Column(name="CUST_ID") 
Long id; 

Kluczową sprawą jest, aby zrozumieć, że generowana wartość ma strategię i strategię wygenerowanego wartość określa, co się dzieje. W powyższym przykładzie strategia generowania SEQUENCE oznacza, że ​​ORM zapyta bazę danych o nową wartość dla sekwencji podczas zapisywania obiektu po raz pierwszy. Drugi przykład określa strategię generowania tabeli, co oznacza, że ​​ORM będzie sprawdzać wiersz w tabeli, aby określić wartość id. W przykładowym przykładzie 2 dane dotyczące używanej tabeli nie są wyświetlane, ponieważ odnoszą się do generatora o nazwie "CUST_GEN"

Typowe generatory, na które napotkasz.

  • Identity - Po wkładka zapytać kolumnę auto incerement do wartości przedmiotu
  • Sequence - wartość pochodzi z sekwencji db
  • tabeli - wartość pochodzi z innej tabeli w bazie danych
  • auto - wybierz jedną z powyżej na podstawie typu bazy
  • UUID - generowanie UUID przed wykonaniem wkładki

jest możliwie pobiera le do opracowania niestandardowego generatora. Interakcja z bazą danych będzie zależeć od strategii generowania.

+0

dziękuję za adresowanie tego z punktu widzenia db – javaNoober

+0

, który najlepiej pasuje do jednej identyfikacji lub sekwencji –

-3

jeśli używasz w swojej klasie jednostki fasoli

@Id 
@GeneratedValue 
@Column(name="CUST_ID") 
public Long getId() { return id; } 

W tym przypadku Hibernate będzie określić, jaki rodzaj klucza podstawowego zostanie wygenerowany i to zależy od tego, co baza danych używasz.

Domyślnie adnotacja @Id automatycznie określa najbardziej odpowiednią strategię generowania klucza podstawowego, ale można ją zmienić, stosując adnotację @GeneratedValue, która przyjmuje dwie strategie parametrów i generator, których nie omówię tutaj, więc używajmy tylko domyślnej domyślnej strategii generowania kluczy. Umożliwienie Hibernate określenia, jakiego typu generatora użyć, spowoduje, że twój kod będzie przenośny między różnymi bazami danych.

+0

Pytanie miało wyjaśnić "jak działa @GeneratedValue", którą całkowicie pominąłeś. –

Powiązane problemy