- 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.
@EntityAnnotation 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,namecủa class.@Tablecho 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
lengthcho 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
nullablecho 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
uniquecho phép cột được đánh dấu chỉ chứa các giá trị duy nhất.
- Thuộc tính
@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@Temporalsử 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
}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
@ManyToOnemô 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;
}@OneToManymô 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;
}
}@OneToOnemô tả quan hệ 1 - 1@ManyToManymô tả quan hệ N - N
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ượngRoletừ DB thì nó sẽ không lấy cái đối tượngUserliê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ớiLazy,Eagersẽ lấy tất cả các đối tượngUserliên quan và lưu vàouserList
https://www.baeldung.com/jpa-entities
https://stackjava.com/hibernate/hibernate-fetchtype-la-gi-phan-biet-fetchtype-lazy-voi-eager.html