Adnotare @Id

Fiecare entitate Entity din Hibernate trebuie să aibă un câmp care va fi cheia primară: conține o valoare unică pentru toate obiectele acestei clase. De obicei, acest câmp este adnotat cu adnotarea @Id .

Forma generala:

@Id
Class Name;

Exemplu:

@Entity
@Table(name="user")
class User
{
   @Id
   @Column(name="id")
   public Integer id;

   @Embedded
   public UserAddress address;

   @Column(name="created_date")
   public Date createdDate;
}

Plasarea adnotărilor

Apropo, puteți scrie adnotări @Column nu numai pentru câmpuri, ci și pentru metode: pentru getters sau setters. Exemplu:

@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;
   }
}

Această abordare a apărut atunci când adnotările au început să fie adăugate nu numai la clase, ci și la interfețe. Interfața nu are câmpuri de clasă, dar există metode: getters și setters. Hibernate acceptă ambele standarde.

Important! Dacă o clasă are adnotarea @Entity , atunci toate câmpurile sale sunt tratate de Hibernate ca câmpuri persistente (cu excepția cazului în care au specificată adnotarea @Transient ). Chiar dacă câmpurile nu au deloc adnotări: în acest caz, numele coloanei este considerat egal cu numele câmpului clasei.

Aici adnotarea @Id joacă un rol important. Dacă adnotarea este plasată pe un câmp de clasă, atunci Hibernate va analiza numele și tipurile câmpurilor. Dacă adnotarea @Id este plasată pe o metodă, atunci Hibernate va analiza numele și tipurile metodelor.

Exemplul 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 ")

}

Exemplul 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;
   }

}

Adnotare @GeneratedValue

Puteți atribui singur un id noilor voastre obiecte sau îl puteți lăsa la mila lui Hibernate. Pentru ca Hibernate să înțeleagă mai bine cum să atribuiți ID-uri obiectelor dvs., are o adnotare specială:

@GeneratedValue

Această adnotare marchează de obicei același câmp ca adnotarea @Id . Ea are 4 strategii posibile de atribuire a ID-ului:

  • AUTO
  • IDENTITATE
  • SECVENŢĂ
  • MASA

Un exemplu de adnotare cu strategia specificată:

@Entity
@Table(name="user")
class User
{
    @Id
	@GeneratedValue(strategy = GenerationType.AUTO)
    public Integer id;

    public Date createdDate;
}

Dacă nu este specificată nicio valoare a politicii, va fi selectată strategia AUTO. Strategia AUTO înseamnă că Hibernate va atribui ID-ul însuși, pe baza în primul rând pe tipul de date al câmpului ID.

De ce pe tip? Da, deoarece tipurile de ID pot fi foarte diferite, de exemplu, String sau GUID. Exemplu:

@Entity
@Table(name="user")
class User
{
    @Id
	@GeneratedValue
    public UUID id;

    public Date createdDate;
}

Notă: Un GUID în Java se numește UUID, istoric vorbind. Iar Hibernate poate genera UUID-uri unice pentru obiectele tale, dacă îi ceri.

Diverse strategii @GeneratedValue

Dacă specificați tipul GeneratedValue(strategy = GenerationType.IDENTITY) , atunci Hibernate deleagă setarea ID-ului la stratul bazei de date. În mod obișnuit, aceasta folosește o coloană etichetată CHEIE PRIMARĂ, INCREMENTARE AUTOMATĂ.

Dar dacă doriți ca ID-urile dvs. să fie unice și generate conform unui algoritm special specificat, atunci puteți utiliza adnotarea GeneratedValue(strategy = GenerationType.SEQUENCE) , de exemplu:

@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;

	// ...
}

Există mai multe moduri de a genera un ID. De exemplu, este posibil să aveți o cheie unică compusă constând din mai multe coloane. Și când scrieți un obiect în baza de date, trebuie să completați toate aceste coloane.

Nu le voi da în detaliu. Totuși, scopul prelegerilor noastre este de a face cunoștință cu Hibernate și nu de a repovesti documentația oficială.