post-image

@Entity @Id @Table trong JPA – Hibernate

Spring Data JPA

Trong JPA Hibernate, một entity là một Java class tương ứng với một table trong database, mỗi entity object tương ứng với một dòng trong bảng. JPA yêu cầu một entity class phải cung cấp đầy đủ các metadata để ánh xạ giữa entity class và table như tên cột, kiểu dữ liệu, khoá chính, khoá ngoại, etc.

TÀI LIỆU HỌC LẬP TRÌNH

JPA Hibernate đều cho phép một entity class cung cấp metadata qua 2 cách: annotation và xml descriptors. Trong bài viết này chúng ta sẽ sử dụng annotation để cấu hình một entity class vì tính tiện dụng và dễ làm của nó. Ngoài ra một lợi ích to lớn khi dùng annotation là nó cho phép các metadata được đi cùng entity class thay vì một file xml đặt ở một nơi khác.

Annotation @Entity

Để nói về annotation @Entity, đầu tiên các bạn nên biết về POJO (Plain Old Java Object) và JavaBean.

POJO là những Java object mà chúng không bị hạn chế bởi bất cứ thứ gì khác. Chúng không hiện thực hay được mở rộng từ bất kỳ một class nào khác và chúng cũng không chứa bất kỳ annotation nào trong bản thân chúng. Chúng chỉ chứa các thuộc tính, các phương thức Setter, Getter của những thuộc tính đó và có thể có thêm cả các phương thức override toString() và equals().

THAM GIA KHÓA HỌC LẬP TRÌNH

@Entity
public class Employee {

    private Long id;
    private String name;

    private String gender;

    // getter setter

}
Code language: PHP (php)

Mọi entity đề phải gắn @Entity. Hibernate sẽ dựa vào thôn tin này để mapping xuống một bảng trong database. Nếu @Entity không có tham số, tên của entity này trong database sẽ là tên của class. Nếu truyền tham số name vào thì sẽ custom được tên bảng.

Annotation @Id

Chúng ta đều biết rằng mỗi Entity đề phải có một id, id dùng để định danh, phân biệt giữa các bản ghi với nhau, đã là id thì nó phải unique. Id là được dùng để làm khóa chính của bảng.

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String gender;

    private String gender;

    // getter setter

}

Code language: PHP (php)

Chúng ta có thể sinh giá trị cho khóa chính tự động bằng cách sử dụng @GeneratedValue với các GenerationType khác nhau. Có 4 GenerationType khác nhau chúng ta có thể chọn là, AUTO, TABLE, SEQUENCE, và IDENTITY.

Tổng hợp 200+ tài liệu, sách, bài thực hành, video hướng dẫn lập trình… từ cơ bản đến nâng cao

Ví dụ trên tôi dùng IDENTITY để sau khi một bản ghi được tạo ra thì id của nó sẽ tăng dần. Chúng ta không cần quan tâm đến giá trị của khoá chính mà database sẽ chịu trách nhiệm sinh ra giá trị này.

Annotation @Table


@Entity
@Table(name = "EMPLOYEE")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String gender;

    private String gender;

    // getter setter

}

Code language: PHP (php)

Mặc định tên table dưới database(chú ý giúp mình chỗ này) cũng sẽ giống với Entity class. Trong trường hợp tên table và tên entity không giống nhau, chúng ta có thể sử dụng @Table annotation để chỉ rõ table tương ứng với entity name.

Các bạn cần phân biệt giữa @Entity(name = ‘EntityName’) và @Table(name = “TableName”) vì mình thấy rất nhiều bạn bị nhầm lẫn, @Entity(name = ‘EntityName’) dùng để chỉ tên của entity được Hibernate quản lý trong khi @Table(name = “TableName”) chỉ đích danh tên của table dưới database. Ví dụ khi chúng ta sử dụng HQL để truy vấn thì chúng ta cần chỉ định EntityName và Hibernate sẽ dựa vào đó để ánh xạ thành TableName tương ứng.

Hibernate: select m from EntityName m => SQL: select m from TableName mCode language: JavaScript (javascript)

Tham khảo một số bài viết khác:

https://hocspringboot.net/2021/08/16/nhung-annotation-trong-spring-boot/

Leave a Reply

Your email address will not be published. Required fields are marked *