Adnotacja @Id
Każda jednostka Entity w Hibernate musi mieć pole, które będzie kluczem podstawowym: zawiera unikalną wartość dla wszystkich obiektów tej klasy. Zazwyczaj to pole jest opatrzone adnotacją @Id .
Formularz ogólny:
@Id
Class Name;
Przykład:
@Entity
@Table(name="user")
class User
{
@Id
@Column(name="id")
public Integer id;
@Embedded
public UserAddress address;
@Column(name="created_date")
public Date createdDate;
}
Umieszczenie adnotacji
Nawiasem mówiąc, adnotacje @Column można pisać nie tylko dla pól, ale także dla metod: dla pobierających lub ustawiających. Przykład:
@Entity
@Table(name="user")
class User
{
public Integer id;
public Date createdDate;
@Id
@Column(name="id")
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="created_date")
public Date getDate() {
return this.createdDate;
}
public void setCreatedDate(Date date) {
this. createdDate = date;
}
}
Takie podejście pojawiło się, gdy zaczęto dodawać adnotacje nie tylko do klas, ale także do interfejsów. Interfejs nie posiada pól klas, ale są metody: pobierające i ustawiające. Hibernate obsługuje oba te standardy.
Ważny! Jeśli klasa ma adnotację @Entity , to wszystkie jej pola są traktowane przez Hibernate jako pola trwałe (chyba że mają określoną adnotację @Transient ). Nawet jeśli pola nie mają żadnych adnotacji: w tym przypadku nazwa kolumny jest traktowana jako równa nazwie pola klasy.
W tym miejscu adnotacja @Id odgrywa ważną rolę. Jeśli adnotacja zostanie umieszczona na polu klasy, Hibernate przyjrzy się nazwom i typom pól. Jeśli adnotacja @Id zostanie umieszczona na metodzie, Hibernate przyjrzy się nazwom i typom metod.
Przykład 1:
@Entity
@Table(name="user")
class User
{
@Id
public Integer id;
public Date createdDate; //this field will be treated as if it had @Column(name=" createdDate ")
}
Przykład 2:
@Entity
@Table(name="user")
class User
{
public Integer id;
public Date createdDate;
@Id
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public Date getDate() { //this field will be treated as if it had @Column(name=”date ”)
return this.createdDate;
}
public void setCreatedDate(Date date) {
this. createdDate = date;
}
}
Adnotacja @GeneratedValue
Możesz samodzielnie przypisać identyfikator do swoich nowych obiektów lub pozostawić go na łasce Hibernate. Aby Hibernate lepiej zrozumiał, jak przypisywać identyfikatory do twoich obiektów, ma specjalną adnotację:
@GeneratedValue
Ta adnotacja zazwyczaj oznacza to samo pole co adnotacja @Id . Ma 4 możliwe strategie przydzielania identyfikatorów:
- AUTOMATYCZNY
- TOŻSAMOŚĆ
- SEKWENCJA
- TABELA
Przykład adnotacji z określoną strategią:
@Entity
@Table(name="user")
class User
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer id;
public Date createdDate;
}
Jeśli nie zostanie określona żadna wartość zasady, zostanie wybrana strategia AUTO. Strategia AUTO oznacza, że Hibernate sam przypisze identyfikator, bazując przede wszystkim na typie danych pola identyfikatora.
Dlaczego w typie? Tak, ponieważ typy identyfikatorów mogą być bardzo różne, na przykład String lub GUID. Przykład:
@Entity
@Table(name="user")
class User
{
@Id
@GeneratedValue
public UUID id;
public Date createdDate;
}
Uwaga: Identyfikator GUID w Javie jest nazywany UUID, historycznie rzecz biorąc. A Hibernate może generować unikalne identyfikatory UUID dla twoich obiektów, jeśli go o to poprosisz.
Różne strategie @GeneratedValue
Jeśli określisz typ GeneratedValue(strategy = GenerationType.IDENTITY) , Hibernate deleguje ustawienie identyfikatora do warstwy bazy danych. Zazwyczaj używa to kolumny oznaczonej KLUCZ PODSTAWOWY, AUTOINCREMENT.
Ale jeśli chcesz, aby Twoje identyfikatory były unikalne i generowane zgodnie ze specjalnie określonym algorytmem, możesz użyć adnotacji GeneratedValue(strategy = GenerationType.SEQUENCE) , na przykład:
@Entity
@Table(name="user")
public class User {
@Id
@GeneratedValue(generator = "sequence-generator")
@GenericGenerator(
name = "sequence-generator",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "user_sequence"),
@Parameter(name = "initial_value", value = "4"),
@Parameter(name = "increment_size", value = "1")
}
)
private long userId;
// ...
}
Istnieje wiele innych sposobów generowania identyfikatora. Na przykład możesz mieć złożony unikalny klucz składający się z kilku kolumn. A pisząc obiekt do bazy danych, musisz wypełnić wszystkie te kolumny.
Nie podam ich szczegółowo. Mimo to celem naszych wykładów jest zapoznanie się z Hibernate, a nie powtarzanie oficjalnej dokumentacji.
GO TO FULL VERSION