Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

README.md

Entity, ORM, Relationship, Fetch Type (Lazy vs Eager)

1. Entity

  • Entity là các đối tượng thể hiện tương ứng 1 table trong cơ sở dữ liệu. Khi lập trình, entity thường là các class POJO đơn giản, chỉ gồm các method getter, setter.
  • @Entity Annotation sử dụng để chú thích một class là một Entity. Một Entity khớp với một bảng lấy tên theo thứ tự ưu tiên là: name trong @Table, @Entity, name của class.
  • @Table cho phép chú thích tên bảng thông qua thuộc tính name (thuộc tính này không bắt buộc).
  • @Column được sử dụng để chỉ định thông tin chi tiết của cột mà một field của entity sẽ được ánh xạ với một column trong database.
    • Thuộc tính name được sử dụng để chị định tên cột nào trong database map với tên field được chú thích. Nếu không chỉ định, Hibernate sẽ lấy tên field map với tên cột trong database.
    • Thuộc tính length cho phép kích thước của cột. @Column không chỉ rõ phần tử length, mặc định nó là 255.
    • Thuộc tính nullable cho phép cột được đánh dấu KHÔNG NULL khi schema được tạo ra. Giá trị nullable mặc định là true.
    • Thuộc tính unique cho phép cột được đánh dấu chỉ chứa các giá trị duy nhất.
  • @Transient: khai báo phương thức, thuộc tính này không liên quan đến thuộc tính nào trong database
  • @Temporal sử dụng để chú thích cho cột dữ liệu ngày tháng và thời gian (date time). Có 3 giá trị cho TemporalType:
    • TemporalType.DATE : chú thích cột sẽ lưu trữ ngày tháng năm (bỏ đi thời gian).
    • TemporalType.TIME : chú thích cột sẽ lưu trữ thời gian (Giờ phút giây).
    • TemporalType.TIMESTAMP : chú thích cột sẽ lưu trữ ngày tháng và cả thời gian.
  • @Id được sử dụng để mô tả đây là Id (Identity) của Entity, nó tương đương với cột đó là khóa chính (Primary Key) của table trong database.
  create table "user"
  (
      id       serial       not null
          constraint user_pk
              primary key,
      username varchar(50)  not null,
      password varchar(255),
      email    varchar(255) not null,
      role_id  integer default 3
          constraint user_role_id_fk
              references role
  );
  @Entity
  @Table(name = "user", schema = "public")
  public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(name = "username")
    private String username;
    private String password;
    private String email;
    private int role;
  
      //GETTER / SETTER
  }

2. ORM

ORM (Object Relational Mapping), là một kỹ thuật / cơ chế lập trình thực hiện ánh xạ CSDL sang các đối tượng trong các ngôn ngữ lập trình hướng đối tượng

3. Relationship

  • @ManyToOne mô tả quan hệ 1 – N, thường được sử dụng với @JoinColum
  create table role
  (
      id   integer generated by default as identity
          constraint role_pkey
              primary key,
      name varchar(255)
  );
  @Entity
  @Table(name = "user", schema = "public")
  @Getter
  @Setter
  @AllArgsConstructor
  @NoArgsConstructor
  @ToString
  public class User {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private int id;
      private String username;
      private String password;
      private String email;
      @ManyToOne
      @JoinColumn(name = "role_id", nullable = false)
      private Role role;
  }
  • @OneToMany mô tả quan hệ 1 - N. Nó là đảo ngược của @ManyToOne, và vì vậy nó dựa vào @ManyToOne để định nghĩa ra @OneToMany.
  @Entity
  @Table(name = "role", schema = "public")
  @Setter
  @NoArgsConstructor
  @AllArgsConstructor
  @ToString
  public class Role {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private int id;
      private String name;
      @OneToMany(fetch = FetchType.LAZY, mappedBy = "role")
      private Set<User> userList = new HashSet<>();
  
      public int getId() {
          return id;
      }
  
      public String getName() {
          return name;
      }
  
  }
  • @OneToOne mô tả quan hệ 1 - 1
  • @ManyToMany mô tả quan hệ N - N

4. Fetch Type

Fetchtype là thuộc tính trong các annotation @OneToOne, @OneToMany, @ManyToOne,@ManyToMany, được dùng để định nghĩa phương thức lấy các đối tượng liên quan.

  • FetchType.Lazy: chỉ tải dữ liệu khi được gọi. Như ở ví dụ ở phần Relationship, khi ta find, select đối tượng Role từ DB thì nó sẽ không lấy cái đối tượng User liên quan.
  • FetchType.Eager: tải tất cả dữ liệu từ các đối tượng liên quan. Ngược lại với Lazy, Eager sẽ lấy tất cả các đối tượng User liên quan và lưu vàouserList

Tham khảo

https://www.baeldung.com/jpa-entities

https://stackjava.com/hibernate/hibernate-fetchtype-la-gi-phan-biet-fetchtype-lazy-voi-eager.html