khóa chính

Có sẵn

chú thích @Id

Mỗi thực thể Entity trong Hibernate phải có một trường sẽ là khóa chính: nó chứa một giá trị duy nhất cho tất cả các đối tượng của lớp này. Thông thường, trường này được chú thích bằng chú thích @Id .

Hình thức chung:

@Id
Class Name;

Ví dụ:

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

   @Embedded
   public UserAddress address;

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

Vị trí chú thích

Nhân tiện, bạn có thể viết chú thích @Column không chỉ cho các trường mà còn cho các phương thức: cho getters hoặc setters. Ví dụ:

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

Cách tiếp cận này xuất hiện khi các chú thích bắt đầu được thêm không chỉ vào các lớp mà còn vào các giao diện. Giao diện không có các trường lớp, nhưng có các phương thức: getters và setters. Hibernate hỗ trợ cả hai tiêu chuẩn này.

Quan trọng! Nếu một lớp có chú thích @Entity thì tất cả các trường của lớp đó được Hibernate coi là trường liên tục (trừ khi chúng có chú thích @Transient được chỉ định ). Ngay cả khi các trường hoàn toàn không có bất kỳ chú thích nào: trong trường hợp này, tên cột được coi là bằng với tên trường lớp.

Đây là nơi chú thích @Id đóng vai trò quan trọng. Nếu chú thích được đặt trên một trường lớp, thì Hibernate sẽ xem xét tên và loại của các trường. Nếu chú thích @Id được đặt trên một phương thức, thì Hibernate sẽ xem xét tên và loại của phương thức.

Ví dụ 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 ")

}

Ví dụ 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;
   }

}

Chú thích @GeneratedValue

Bạn có thể tự gán id cho các đối tượng mới của mình hoặc để nó cho Hibernate. Để Hibernate hiểu rõ hơn về cách gán ID cho các đối tượng của bạn, nó có một chú thích đặc biệt:

@GeneratedValue

Chú thích này thường đánh dấu cùng một trường với chú thích @Id . Cô ấy có 4 chiến lược gán ID khả thi:

  • TỰ ĐỘNG
  • DANH TÍNH
  • SỰ LIÊN TIẾP
  • BÀN

Một ví dụ về chú thích với chiến lược được chỉ định:

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

    public Date createdDate;
}

Nếu không có giá trị chính sách nào được chỉ định, chiến lược AUTO sẽ được chọn. Chiến lược AUTO có nghĩa là Hibernate sẽ tự gán ID, chủ yếu dựa trên loại dữ liệu của trường ID.

Tại sao trên loại? Có, vì các loại ID có thể rất khác nhau, ví dụ: Chuỗi hoặc GUID. Ví dụ:

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

    public Date createdDate;
}

Lưu ý: GUID trong Java được gọi là UUID, theo lịch sử. Và Hibernate có thể tạo các UUID duy nhất cho các đối tượng của bạn nếu bạn yêu cầu.

Các chiến lược @GeneratedValue khác nhau

Nếu bạn chỉ định loại GeneratedValue(strategy = GenerationType.IDENTITY) , thì Hibernate ủy quyền cài đặt ID cho lớp cơ sở dữ liệu. Thông thường, điều này sử dụng một cột có nhãn PRIMARY KEY, AUTOINCREMENT.

Nhưng nếu bạn muốn ID của mình là duy nhất và được tạo theo một thuật toán được chỉ định đặc biệt, thì bạn có thể sử dụng chú thích GeneratedValue(strategy = GenerationType.SEQUENCE) chẳng hạn:

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

	// ...
}

Có nhiều cách khác để tạo ID. Ví dụ: bạn có thể có một khóa duy nhất tổng hợp bao gồm một số cột. Và khi ghi một đối tượng vào cơ sở dữ liệu, bạn cần điền vào tất cả các cột này.

Tôi sẽ không cung cấp cho họ một cách chi tiết. Tuy nhiên, mục đích của các bài giảng của chúng tôi là làm quen với Hibernate chứ không phải để kể lại tài liệu chính thức.

Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào