JavaRush /Курсы /All lectures for GE purposes /პირველადი გასაღები

პირველადი გასაღები

All lectures for GE purposes
1 уровень , 281 лекция
Открыта

ანოტაცია @Id

ყოველი Entity-ობიექტი Hibernate-ში უნდა ჰქონდეს ველი, რომელიც იქნება პირველადი გასაღები: შეიცავდეს უნიკალურ მნიშვნელობას ამ კლასის ყველა ობიექტისთვის. ჩვეულებრივ, ეს ველი აღინიშნება ანოტაციით @Id.

ზოგადი ხედი:


   @Id
   კლასი სახელი;

მაგალითი:


@Entity
@Table(name="user")
class User
{
   @Id
   @Column(name="id")
   public Integer id;
 
   @Embedded
   public UserAddress address;
 
   @Column(name="created_date")
   public Date createdDate;
}

ანოტაციების განთავსება

სხვათა შორის, შეგიძლია ანოტაციები @Column დაწერო არა მხოლოდ ველებზე, არამედ მეთოდებზე: გეტერებზე ან სეტერებზე. მაგალითი:


@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 getCreatedDate() {
  	return this.createdDate;
   }
   public void setCreatedDate(Date date) {
      this.createdDate = date;
   }
}

ეს მიდგომა გამოჩნდა, როდესაც ანოტაციები დაიწყეს არა მხოლოდ კლასებში არამედ ინტერფეისებში დამატებაც. ინტერფეისებს არ აქვთ კლასური ველები, მაგრამ აქვთ მეთოდები: გეტერები და სეტერები. Hibernate მხარს უჭერს ორივე სტანდარტს.

მნიშვნელოვანია! თუ კლასს აქვს ანოტაცია @Entity, მაშინ Hibernate ყველა მის ველს განიხილავს როგორც შენახვის ველები (თუ მათზე არ არის მითითებული ანოტაცია @Transient). თუნდაც ველებზე არ იყოს საერთოდ არანაირი ანოტაცია: ამ შემთხვევაში სვეტის სახელი ითვლება კლასის ველის სახელთან თანასწორად.

და აქ ანოტაცია @Id უდიდეს როლს თამაშობს. თუ ანოტაცია განთავსებულია კლასის ველზე, მაშინ Hibernate უყურებს ველების სახელებსა და ტიპებს. თუ ანოტაცია @Id მეთოდზეა, მაშინ Hibernate უყურებს მეთოდების სახელებსა და ტიპებს.

მაგალითი 1:


@Entity
@Table(name="user")
class User
{
   @Id
    public Integer id;
    public Date createdDate;  //ეს ველი დამუშავებული იქნება თითქოს აქ არის @Column(name="createdDate")
 
}

მაგალითი 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 getCreatedDate() { //ეს ველი დამუშავებული იქნება თითქოს აქ არის @Column(name="createdDate")
  	return this.createdDate;
   }
   public void setCreatedDate(Date date) {
  	this.createdDate = date;
   }
 
}

ანოტაცია @GeneratedValue

შეგიძლია შენ თვითონ მიაწვდინო id ახალ ობიექტებს, ან დაუტოვო ეს Hibernate-სთვის. იმისათვის, რომ Hibernate უკეთესად გაიგოს, როგორ მიაწვდინოს ID შენს ობიექტებს, მას აქვს სპეციალური ანოტაცია:


@GeneratedValue

ამ ანოტაციით ჩვეულებრივ ანოტაცია @Id აღინიშნება იგივე ველი. მას აქვს ID-ების მინიჭების 4 შესაძლო სტრატეგია:

  • AUTO
  • IDENTITY
  • SEQUENCE
  • TABLE

ანოტაციის მაგალითი მითითებული სტრატეგიით:


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

თუ სტრატეგიის მნიშვნელობა არ არის მითითებული, მაშინ აირჩევა AUTO სტრატეგია. AUTO სტრატეგია ნიშნავს, რომ Hibernate თვითონ დანიშნავს ID, ძირითადად ID ველის მონაცემთა ტიპზე დაყრდნობით.

რატომ კონკრეტულად ტიპზე? იმიტომ რომ ID-ის ტიპები შეიძლება ძალიან განსხვავებული იყოს, მაგალითად, String ან GUID. მაგალითი:


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

შენიშვნა: Java-ში GUID נקרא UUID, ის ისტორიულად ასე წავიდა. და Hibernate შეუძლია უნიკალური UUID-ების გენერაცია შენს ობიექტებისთვის, თუ სთხოვ ამას.

სხვადასხვა სტრატეგიები @GeneratedValue

თუ მიუთითებთ ტიპს GeneratedValue(strategy = GenerationType.IDENTITY), მაშინ Hibernate დანიშნავს ID მონაცემთა ბაზის დონეზე. ჩვეულებრივ, ამ შემთხვევაში გამოიყენება PRIMARY KEY, AUTOINCREMENT-ით მონიშნული სვეტი.

ხოლო თუ გსურს, რომ შენი ID-ები უნიკალური იყოს და გენერირდებოდეს სპეციალურად განსაზღვრული ალგორითმით, შეგიძლია გამოიყენო ანოტაცია GeneratedValue(strategy = GenerationType.SEQUENCE), მაგალითი:


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

არსებობს კიდევ ბევრი სხვადასხვა მეთოდი ID-ის გენერაციისთვის. მაგალითად, შეიძლება გქონდეს კომპოზიციური უნიკალური გასაღები, რომელიც შედგება რამდენიმე სვეტიდან. და ობიექტის მონაცემთა ბაზაში ჩაწერისას, საჭიროა ყველა ეს სვეტი შევსდეს.

მე არ მოვიტან დეტალურად ამ ყველაფერს. ბოლოსდაბოლოს, ჩვენი ლექციების ამოცანაა - Hibernate-თან გაცნობა, და არა ოფიციალური დოკუმენტაციის გადმოცემა.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ