@Id-kommentar

Hver Entity-enhet i Hibernate må ha et felt som vil være primærnøkkelen: den inneholder en unik verdi for alle objekter i denne klassen. Vanligvis er dette feltet merket med @Id -kommentaren .

Generell form:

@Id
Class Name;

Eksempel:

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

   @Embedded
   public UserAddress address;

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

Plassering av merknader

Forresten, du kan skrive @Column- kommentarer ikke bare for felt, men også for metoder: for gettere eller settere. Eksempel:

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

Denne tilnærmingen dukket opp da merknader begynte å bli lagt ikke bare til klasser, men også til grensesnitt. Grensesnittet har ikke klassefelt, men det finnes metoder: getters og settere. Hibernate støtter begge disse standardene.

Viktig! Hvis en klasse har @Entity- kommentaren , behandles alle dens felt av Hibernate som vedvarende felt (med mindre de har @Transient -kommentaren spesifisert ). Selv om feltene ikke har noen merknader i det hele tatt: i dette tilfellet anses kolonnenavnet som lik klassens feltnavn.

Det er her @Id -kommentaren spiller en viktig rolle. Hvis merknaden er plassert på et klassefelt, vil Hibernate se på navnene og typene av feltene. Hvis @Id -kommentaren er plassert på en metode, vil Hibernate se på navnene og typene til metodene.

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

}

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

}

@GeneratedValue-kommentar

Du kan tilordne en id til de nye objektene dine selv, eller overlate den til Hibernate. For at Hibernate bedre skal forstå hvordan du tildeler ID-er til objektene dine, har den en spesiell merknad:

@GeneratedValue

Denne merknaden markerer vanligvis det samme feltet som @Id -kommentaren . Hun har 4 mulige ID-tildelingsstrategier:

  • AUTO
  • IDENTITET
  • SEKVENS
  • BORD

Et eksempel på en merknad med den angitte strategien:

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

    public Date createdDate;
}

Hvis ingen policyverdi er spesifisert, vil AUTO-strategien bli valgt. AUTO-strategien betyr at Hibernate vil tildele selve ID-en, hovedsakelig basert på datatypen til ID-feltet.

Hvorfor på type? Ja, fordi ID-typer kan være svært forskjellige, for eksempel String eller GUID. Eksempel:

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

    public Date createdDate;
}

Merk: En GUID i Java kalles en UUID, historisk sett. Og Hibernate kan generere unike UUID-er for objektene dine hvis du ber om det.

Ulike @GeneratedValue-strategier

Hvis du angir typen GeneratedValue(strategy = GenerationType.IDENTITY) , delegerer Hibernate ID-innstillingen til databaselaget. Vanligvis bruker dette en kolonne merket PRIMARY KEY, AUTOINCREMENT.

Men hvis du vil at ID-ene dine skal være unike og genereres i henhold til en spesielt spesifisert algoritme, kan du bruke GeneratedValue (strategy = GenerationType.SEQUENCE) -kommentaren , for eksempel:

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

	// ...
}

Det er mange flere måter å generere en ID på. For eksempel kan du ha en sammensatt unik nøkkel som består av flere kolonner. Og når du skriver et objekt til databasen, må du fylle ut alle disse kolonnene.

Jeg vil ikke gi dem i detalj. Likevel er formålet med forelesningene våre å bli kjent med Hibernate, og ikke å gjenfortelle den offisielle dokumentasjonen.