Báo lỗi đỏ ở resourse trong maven project hibernate năm 2024

@GeneratedValue(strategy = GenerationType.IDENTITY) => id int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY

6: được sử dụng để định nghĩa các kết quả của câu truy vấn SQL dưới dạng tập hợp các

@GeneratedValue(strategy = GenerationType.IDENTITY) => id int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY

7 annotation. được sử dụng để ánh xạ các cột quan hệ dữ liệu của câu truy vấn SQL thành đối tượng Java. Bằng cách chỉ định tên của

@GeneratedValue(strategy = GenerationType.IDENTITY) => id int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY

7 annotation, bạn có thể lựa chọn các cột từ kết quả truy vấn và ánh xạ chúng vào các thuộc tính của đối tượng Java.

  • @GeneratedValue(strategy = GenerationType.IDENTITY) => id int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY 9 là một annotation được sử dụng trong JPA (Java Persistence API) để định nghĩa một truy vấn SQL nguyên thủy (native query).
  • @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_sequence_name") 0: Annotation @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_sequence_name") 0 được đặt trước một phương thức hoặc một lớp và chỉ định rằng phương thức hoặc tất cả các phương thức trong lớp được gọi trong một giao dịch (transaction). Giao dịch dùng để đảm bảo tính nhất quán của dữ liệu và bảo đảm rằng các thay đổi được thực hiện thành công hoặc rollback nếu có lỗi xảy ra. Annotation này giúp giảm thiểu việc viết mã để quản lý giao dịch thủ công và đảm bảo rằng các thay đổi dữ liệu được xử lý một cách an toàn và nhất quán.
  • @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_sequence_name") 2: Annotation @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_sequence_name") 2 được sử dụng để chỉ định rằng phương thức đang thực hiện một hành động sửa đổi dữ liệu trong cơ sở dữ liệu, không phải là một truy vấn truy xuất dữ liệu. Annotation này cần được sử dụng kèm với annotation @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_sequence_name") 0.
  • @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_sequence_name") 5: Annotation @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_sequence_name") 5 được sử dụng để định nghĩa truy vấn SQL hoặc JPQL (Java Persistence Query Language) mà phương thức sẽ thực hiện. Với @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_sequence_name") 7, câu lệnh truy vấn được sử dụng là một câu lệnh SQL gốc (Native SQL) thay vì truy vấn JPQL. Các tham số của truy vấn được chỉ định bằng cách sử dụng các tham số có tên (?1, ?2, ...) và các tham số này sẽ được truyền vào từ các tham số của phương thức.

Tổng quan Swagger: Để sử dụng cơ bản thì Swagger cung cấp một số các Annotations hữu ích sau:

SYNTAX DESCRIPTION

SYNTAX DESCRIPTION @Api Đánh dấu 1 class là nơi chứa các API @ApiModel Đánh dấu 1 class là Swagger Model @ApiModelProperty Bổ sung các thông tin cho @ApiOperation Mô tả cho một API và response của nó @ApiParam Mô tả các parameter @ApiResponse Mô tả status code của response @ApiResponses Mô tả danh sách các status code của response

GeneratedValue: và Trường sinh này áp dụng cho các trường kiểu số nguyên

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_sequence_name")

8 hoặc số dấu thập phân

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_sequence_name")

9

  • @GeneratedValue(strategy = GenerationType.TABLE, generator = "your_table_generator_name") 0: là một kiểu sinh giá trị tự động. hệ thống sẽ cố gắng tự động xác định cách sinh giá trị tốt nhất dựa trên cơ sở dữ liệu bạn đang sử dụng.

@GeneratedValue(strategy = GenerationType.AUTO)

  • @GeneratedValue(strategy = GenerationType.TABLE, generator = "your_table_generator_name") 1: Được sử dụng với các cơ sở dữ liệu hỗ trợ tự động tăng (auto-increment) như MySQL hoặc PostgreSQL. Khi bạn chọn kiểu này, cơ sở dữ liệu sẽ tự động tăng giá trị của trường này khi một bản ghi mới được thêm vào cơ sở dữ liệu.

@GeneratedValue(strategy = GenerationType.IDENTITY) => id int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY

  • @GeneratedValue(strategy = GenerationType.TABLE, generator = "your_table_generator_name") 2: Sử dụng với cơ sở dữ liệu hỗ trợ chuỗi số (sequence) như Oracle. Bạn cần phải cung cấp tên của chuỗi số mà bạn muốn sử dụng.

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_sequence_name")

  • @GeneratedValue(strategy = GenerationType.TABLE, generator = "your_table_generator_name") 3: Sử dụng với cơ sở dữ liệu không hỗ trợ tự động tăng hoặc chuỗi số. Hibernate (một triển khai JPA phổ biến) sẽ sử dụng một bảng tạm thời để theo dõi và sinh giá trị duy nhất cho trường.

@GeneratedValue(strategy = GenerationType.TABLE, generator = "your_table_generator_name")

Serializable and De-Serializable

Báo lỗi đỏ ở resourse trong maven project hibernate năm 2024

Tạo database table tự động từ Hibernate Entity:

Báo lỗi đỏ ở resourse trong maven project hibernate năm 2024

Báo lỗi đỏ ở resourse trong maven project hibernate năm 2024

  • Hibernate tạo lược đồ tự động : @GeneratedValue(strategy = GenerationType.TABLE, generator = "your_table_generator_name") 4
  • Nếu chúng ta vẫn muốn có cả Hibernate tạo lược đồ tự động kết hợp với tạo lược đồ dựa trên tập lệnh và tập hợp dữ liệu, chúng ta sẽ phải sử dụng: @GeneratedValue(strategy = GenerationType.TABLE, generator = "your_table_generator_name") 5
  • Khởi tạo cơ sở dữ liệu bằng tập lệnh, chúng ta sẽ phải sử dụng: @GeneratedValue(strategy = GenerationType.TABLE, generator = "your_table_generator_name") 6

Cấu hình cơ sở dữ liệu bằng cách sử dụng Hibernate:

Spring cung cấp một thuộc tính JPA cụ thể mà Hibernate sử dụng để tạo DDL: spring.jpa.hibernate.ddl-auto.

  • create (tạo) : Trước tiên Hibernate bỏ các bảng hiện có và sau đó tạo các bảng mới.
  • update (cập nhật): Mô hình đối tượng được tạo dựa trên ánh xạ (Annotations hoặc XML) được so sánh với lược đồ hiện có, sau đó Hibernate cập nhật lược đồ theo sự khác biệt. Nó không bao giờ xóa các bảng hoặc cột hiện có ngay cả khi chúng không còn được ứng dụng yêu cầu.
  • create - drop (tạo - xóa): Tương tự như tạo, với việc bổ sung Hibernate sẽ xóa cơ sở dữ liệu sau khi tất cả các hoạt động hoàn thành; thường được sử dụng cho unit testing.
  • validate (xác thực): Hibernate chỉ xác nhận xem các bảng và cột có tồn tại hay không. Nếu không, nó sẽ ném ra một ngoại lệ.
  • none: Giá trị này sẽ ngay lập tức tắt tạo DDL.

Tùy chỉnh tạo lược đồ cơ sở dữ liệu:

  • @GeneratedValue(strategy = GenerationType.TABLE, generator = "your_table_generator_name") 7: luôn khởi tạo cơ sở dữ liệu
  • @GeneratedValue(strategy = GenerationType.TABLE, generator = "your_table_generator_name") 8: luôn khởi khởi tạo nếu một cơ sở dữ liệu nhúng đang được sử dụng. Đây là mặc định nếu giá trị thuộc tính không được chỉ định.
  • @GeneratedValue(strategy = GenerationType.TABLE, generator = "your_table_generator_name") 9: không bao giờ khởi tạo cơ sở dữ liệu

@SQL: Spring cũng cung cấp Annotatios @Sql - một cách khai báo để khởi tạo và điền vào lược đồ thử nghiệm của chúng ta.

@Sql({"/employees_schema.sql", "/import_employees.sql"}) public class SpringBootInitialLoadIntegrationTest {

@Autowired
private EmployeeRepository employeeRepository;
@Test
public void testLoadDataForTestClass() {
    assertEquals(3, employeeRepository.findAll().size());
}
}

SQL: Chú thích này có thể được sử dụng để gắn SQL query vào một lớp hoặc một phương thức trong dự án Spring Boot của bạn.

@SQL("SELECT * FROM users WHERE username = :username") public User findUserByUsername(String username) {

// Thực hiện truy vấn SQL ở đây
}

SQLConfig: Chú thích này có thể được sử dụng để cấu hình các thiết lập liên quan đến SQL query, ví dụ như cơ sở dữ liệu mặc định để sử dụng.

@SQLConfig(key = "production") public class ProductionDatabaseConfig {

// Cấu hình cho cơ sở dữ liệu sản xuất
}

Annotation Thông Dụng Trong Hibernate :

  1. @Entity : được sử dụng để chú thích một class là một Entity.
  2. Thuộc tính name của @Entity là không bắt buộc.
  3. Entity khớp với một bảng lấy theo tên theo thứ tự ưu tiên:
    • name trong @Table.
    • name trong @Entity.
    • name của class.
  4. @Table
  5. Một table trong database có thể có nhiều ràng buộc unique (duy nhất). Chúng ta có thể sử dụng @Table để mô tả các ràng buộc này
  6. @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).
  7. Nếu không chỉ rõ tên bảng trong phần tử name, Hibernate sẽ dựa vào phần tử name của @Entity sau đó mới tới tên của class.
  8. @Column
  9. @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.
    • 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.
  10. @Transient
  11. Trong entity class có chứa một field mà @Sql({"/employees_schema.sql", "/import_employees.sql"}) public class SpringBootInitialLoadIntegrationTest {
    @Autowired  
    private EmployeeRepository employeeRepository;  
    @Test  
    public void testLoadDataForTestClass() {  
        assertEquals(3, employeeRepository.findAll().size());  
    }  
    
    } 0. Khi đó chúng ta sẽ gặp lỗi “java.sql.SQLSyntaxErrorException: Unknown column ‘additionalPropery’ in ‘field list'”.
  12. Để tránh lỗi này, chúng ta có thể sử dụng @Transient để thông báo rằng thuộc tính/ phương thức này không liên quan gì tới một cột nào dưới database. Khi đó, Hibernate sẽ bỏ qua field này.
  13. @Temporal
  14. @Temporal sử dụng để chú thích cho cột dữ liệu ngày tháng và thời gian (date time).
  15. 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.
  16. @Id
  17. @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.
  18. @GeneratedValue
  19. @GeneratedValue được sử dụng để Hibernate tự động tạo ra giá trị và gán vào cho một cột trong trường hợp insert mới một Entity vào database.
  20. @Lob
  21. @Sql({"/employees_schema.sql", "/import_employees.sql"}) public class SpringBootInitialLoadIntegrationTest {
    @Autowired  
    private EmployeeRepository employeeRepository;  
    @Test  
    public void testLoadDataForTestClass() {  
        assertEquals(3, employeeRepository.findAll().size());  
    }  
    
    } 1 thường chú thích cùng với @Sql({"/employees_schema.sql", "/import_employees.sql"}) public class SpringBootInitialLoadIntegrationTest {
    @Autowired  
    private EmployeeRepository employeeRepository;  
    @Test  
    public void testLoadDataForTestClass() {  
        assertEquals(3, employeeRepository.findAll().size());  
    }  
    
    } 2 để nói rằng cột đó có kiểu @Sql({"/employees_schema.sql", "/import_employees.sql"}) public class SpringBootInitialLoadIntegrationTest {
    @Autowired  
    private EmployeeRepository employeeRepository;  
    @Test  
    public void testLoadDataForTestClass() {  
        assertEquals(3, employeeRepository.findAll().size());  
    }  
    
    } 3 hoặc @Sql({"/employees_schema.sql", "/import_employees.sql"}) public class SpringBootInitialLoadIntegrationTest {
    @Autowired  
    private EmployeeRepository employeeRepository;  
    @Test  
    public void testLoadDataForTestClass() {  
        assertEquals(3, employeeRepository.findAll().size());  
    }  
    
    } 4. Trong một số Database có phân biệt TINY, MEDIUM, LARGE BLOB/CLOB, còn một số database thì không.

@Lob
@Column(name = "avatar", nullable = true, length = Integer.MAX_VALUE)
private byte[] avatar;

  1. @ManyToOne
  2. @ManyToOne mô tả một quan hệ N-1 (Nhiều – Một), nó thường được sử dụng cùng với @JoinColumn.
  3. @Sql({"/employees_schema.sql", "/import_employees.sql"}) public class SpringBootInitialLoadIntegrationTest {
    @Autowired  
    private EmployeeRepository employeeRepository;  
    @Test  
    public void testLoadDataForTestClass() {  
        assertEquals(3, employeeRepository.findAll().size());  
    }  
    
    } 5: LAZY nói với Hibernate rằng, hãy tải dữ liệu một cách lười biếng, nghĩa là chỉ tải khi được gọi (khi cần thiết).
  4. @Sql({"/employees_schema.sql", "/import_employees.sql"}) public class SpringBootInitialLoadIntegrationTest {
    @Autowired  
    private EmployeeRepository employeeRepository;  
    @Test  
    public void testLoadDataForTestClass() {  
        assertEquals(3, employeeRepository.findAll().size());  
    }  
    
    } 6: EAGER nói với Hibernate rằng, hãy truy vấn toàn bộ các cột của bảng liên quan.
  5. @OneToMany
  6. @Sql({"/employees_schema.sql", "/import_employees.sql"}) public class SpringBootInitialLoadIntegrationTest {
    @Autowired  
    private EmployeeRepository employeeRepository;  
    @Test  
    public void testLoadDataForTestClass() {  
        assertEquals(3, employeeRepository.findAll().size());  
    }  
    
    } 7 mô tả quan hệ 1-N (Một – Nhiều). Nó là đảo ngược của @ManyToOne, và vì vậy nó dựa vào @ManyToOne để định nghĩa ra @OneToMany.
  7. @OneToOne
  8. @Sql({"/employees_schema.sql", "/import_employees.sql"}) public class SpringBootInitialLoadIntegrationTest {
    @Autowired  
    private EmployeeRepository employeeRepository;  
    @Test  
    public void testLoadDataForTestClass() {  
        assertEquals(3, employeeRepository.findAll().size());  
    }  
    
    } 8 mô tả quan hệ 1-1 (Một – Một).
  9. @ManyToMany
  10. @ManyToMany mô tả quan hệ N-N (Nhiều – Nhiều).

@Entity @Table public class Role {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "roles")
private Set<User> users;
} @Entity(name = "User") @Table(name = "user") public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// ...
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "user_roles", 
    joinColumns = { @JoinColumn(name = "user_id", nullable = false, updatable = false) }, 
    inverseJoinColumns = { @JoinColumn(name = "role_id", nullable = false, updatable = false) })
private Set<Role> roles;
}

  1. @OrderBy
  2. @OrderBy được sử dụng để sắp xếp một danh sách, vì vậy nó có thể được sử dụng cùng với @OneToMany, @ManyToMany.

@Entity @Table public class Category {

// ...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "category")
@OrderBy("title")
private Set<Post> posts;
}

@Enumerated hỗ trợ hai kiểu ánh xạ Enum :

  • @Sql({"/employees_schema.sql", "/import_employees.sql"}) public class SpringBootInitialLoadIntegrationTest {
    @Autowired  
    private EmployeeRepository employeeRepository;  
    @Test  
    public void testLoadDataForTestClass() {  
        assertEquals(3, employeeRepository.findAll().size());  
    }  
    
    } 9: Khi sử dụng kiểu này, JPA sẽ lưu giá trị của enum dưới dạng số nguyên, tức là vị trí của hằng số enum trong khai báo
  • @SQL("SELECT * FROM users WHERE username = :username") public User findUserByUsername(String username) {
    // Thực hiện truy vấn SQL ở đây  
    
    } 0: Khi sử dụng kiểu này, JPA sẽ lưu giá trị của enum dưới dạng chuỗi, tức là tên của hằng số enum12. Điều này giúp giữ nguyên độ rõ ràng của mã nguồn và đảm bảo tính nhất quán khi thay đổi cấu trúc của enum

@GeneratedValue(strategy = GenerationType.IDENTITY) => id int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY

0

Tổng quan về OAuth trong việc xác thực người dùng từ hệ thống:

OAuth2 có 4 loại định danh chính:

  • Authorization Code
  • Resource Owner Password Credentials
  • Implicit
  • Client Credentials

Để xác thực thì cần:

  • @SQL("SELECT * FROM users WHERE username = :username") public User findUserByUsername(String username) {
    // Thực hiện truy vấn SQL ở đây  
    
    } 1: chuỗi ký tự được sử dụng để định danh ứng dụng.
  • @SQL("SELECT * FROM users WHERE username = :username") public User findUserByUsername(String username) {
    // Thực hiện truy vấn SQL ở đây  
    
    } 2: là một chuỗi ký tự dùng cho việc xác thực Client khi ứng dụng yêu cầu truy cập thông tin tài khoản người dùng. Chuỗi này được giữ bí mật giữa Client và Authorization Server.

Có thể hiểu Client ID là username, Client Secret là password của Client đối với Authorization cũng được. 😄