hoofdsleutel

Beschikbaar

@Id-annotatie

Elke Entity-entiteit in Hibernate moet een veld hebben dat de primaire sleutel zal zijn: het bevat een unieke waarde voor alle objecten van deze klasse. Meestal wordt dit veld geannoteerd met de @Id annotatie .

Algemene vorm:

@Id
Class Name;

Voorbeeld:

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

   @Embedded
   public UserAddress address;

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

Annotatie plaatsing

Trouwens, je kunt @Column- annotaties niet alleen voor velden schrijven, maar ook voor methoden: voor getters of setters. Voorbeeld:

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

Deze benadering verscheen toen annotaties niet alleen aan klassen, maar ook aan interfaces werden toegevoegd. De interface heeft geen klassenvelden, maar er zijn methoden: getters en setters. Hibernate ondersteunt beide standaarden.

Belangrijk! Als een klasse de @Entity- annotatie heeft , worden alle velden ervan door Hibernate behandeld als blijvende velden (tenzij ze de @Transient- annotatie hebben opgegeven ). Zelfs als de velden helemaal geen annotaties hebben: in dit geval wordt de kolomnaam gelijkgesteld aan de klasseveldnaam.

Hier speelt de @Id- annotatie een belangrijke rol. Als de annotatie op een klassenveld wordt geplaatst, kijkt Hibernate naar de namen en typen van de velden. Als de @Id- annotatie op een methode wordt geplaatst, kijkt Hibernate naar de namen en typen van de methoden.

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

}

Voorbeeld 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-annotatie

U kunt zelf een id toewijzen aan uw nieuwe objecten, of dit overlaten aan de genade van Hibernate. Om ervoor te zorgen dat Hibernate beter begrijpt hoe u ID's aan uw objecten kunt toewijzen, heeft het een speciale annotatie:

@GeneratedValue

Deze annotatie markeert meestal hetzelfde veld als de @Id -annotatie . Ze heeft 4 mogelijke ID-toewijzingsstrategieën:

  • AUTO
  • IDENTITEIT
  • REEKS
  • TAFEL

Een voorbeeld van een annotatie met de opgegeven strategie:

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

    public Date createdDate;
}

Als er geen beleidswaarde is opgegeven, wordt de AUTO-strategie geselecteerd. De AUTO-strategie houdt in dat Hibernate de ID zelf toewijst, voornamelijk gebaseerd op het gegevenstype van het ID-veld.

Waarom op soort? Ja, omdat ID-typen heel verschillend kunnen zijn, bijvoorbeeld String of GUID. Voorbeeld:

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

    public Date createdDate;
}

Opmerking: een GUID in Java wordt historisch gezien een UUID genoemd. En Hibernate kan unieke UUID's voor uw objecten genereren als u daarom vraagt.

Verschillende @GeneratedValue-strategieën

Als u het type GeneratedValue(strategy = GenerationType.IDENTITY) opgeeft , delegeert Hibernate de ID-instelling naar de databaselaag. Meestal wordt hiervoor een kolom gebruikt met de naam PRIMARY KEY, AUTOINCREMENT.

Maar als u wilt dat uw ID's uniek zijn en worden gegenereerd volgens een speciaal gespecificeerd algoritme, dan kunt u de annotatie GeneratedValue(strategy = GenerationType.SEQUENCE) gebruiken , bijvoorbeeld:

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

	// ...
}

Er zijn nog veel meer manieren om een ​​ID te genereren. U kunt bijvoorbeeld een samengestelde unieke sleutel hebben die uit meerdere kolommen bestaat. En wanneer u een object naar de database schrijft, moet u al deze kolommen invullen.

Ik zal ze niet in detail geven. Toch is het doel van onze lezingen om kennis te maken met Hibernate, en niet om de officiële documentatie opnieuw te vertellen.

Opmerkingen
  • Populair
  • Nieuw
  • Oud
Je moet ingelogd zijn om opmerkingen te kunnen maken
Deze pagina heeft nog geen opmerkingen