Skip to content

3.2.3 Chú thích các lớp miền để lưu trữ dữ liệu

Điều duy nhất còn lại mà chúng ta cần làm là chú thích (annotate) các lớp miền (domain classes) để Spring Data JDBC biết cách lưu trữ chúng. Nói chung, điều này có nghĩa là bạn sẽ chú thích các thuộc tính định danh với @Id—để Spring Data biết trường nào đại diện cho định danh của đối tượng—và tùy chọn chú thích lớp với @Table.

Ví dụ, lớp TacoOrder có thể được chú thích với @Table@Id như trong đoạn mã sau.

Listing 3.15 Chuẩn bị lớp Taco cho việc lưu trữ dữ liệu

java
package tacos;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.validation.constraints.Digits;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;

import org.hibernate.validator.constraints.CreditCardNumber;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;

import lombok.Data;

@Data
@Table
public class TacoOrder implements Serializable {

  private static final long serialVersionUID = 1L;

  @Id
  private Long id;

  // ...

}

Chú thích @Table là hoàn toàn tùy chọn. Theo mặc định, đối tượng sẽ được ánh xạ tới một bảng dựa trên tên lớp miền. Trong trường hợp này, TacoOrder sẽ được ánh xạ tới bảng có tên "Taco_Order". Nếu điều đó phù hợp với bạn, bạn có thể bỏ qua hoàn toàn chú thích @Table hoặc sử dụng nó mà không cần truyền tham số. Nhưng nếu bạn muốn ánh xạ nó tới một tên bảng khác, bạn có thể chỉ định tên bảng như một tham số trong @Table, như sau:

java
@Table("Taco_Cloud_Order")
public class TacoOrder {
  ...
}

Như bạn thấy ở đây, TacoOrder sẽ được ánh xạ tới bảng có tên "Taco_Cloud_Order".

Còn về chú thích @Id, nó chỉ định trường id là định danh cho một TacoOrder. Tất cả các thuộc tính khác trong TacoOrder sẽ được ánh xạ tự động tới các cột dựa trên tên thuộc tính. Ví dụ, thuộc tính deliveryName sẽ tự động được ánh xạ tới cột có tên delivery_name. Nhưng nếu bạn muốn định nghĩa rõ ràng tên cột ánh xạ, bạn có thể chú thích thuộc tính đó với @Column như sau:

java
@Column("customer_name")
@NotBlank(message="Delivery name is required")
private String deliveryName;

Trong trường hợp này, @Column chỉ định rằng thuộc tính deliveryName sẽ được ánh xạ tới cột có tên là customer_name.

Bạn cũng sẽ cần áp dụng @Table@Id cho các lớp miền khác. Điều này bao gồm cả @Ingredient.

Listing 3.16 Chuẩn bị lớp Ingredient cho việc lưu trữ dữ liệu

java
package tacos;

import org.springframework.data.annotation.Id;
import org.springframework.data.domain.Persistable;
import org.springframework.data.relational.core.mapping.Table;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Table
@AllArgsConstructor
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
public class Ingredient implements Persistable<String> {

  @Id
  private String id;

  // ...

}

...and Taco.

Listing 3.17 Preparing the Taco class for persistence

java
package tacos;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;

import lombok.Data;

@Data
@Table
public class Taco {

  @Id
  private Long id;

  // ...

}

Còn đối với IngredientRef, nó sẽ được ánh xạ tự động tới bảng có tên "Ingredient_Ref", điều này là hoàn hảo cho ứng dụng của chúng ta. Bạn có thể chú thích nó với @Table nếu muốn, nhưng điều đó không bắt buộc. Và vì bảng "Ingredient_Ref" không có cột định danh, nên bạn không cần chú thích bất kỳ trường nào trong IngredientRef với @Id.

Với những thay đổi nhỏ này, chưa kể đến việc loại bỏ hoàn toàn các lớp JdbcIngredientRepositoryJdbcOrderRepository, bạn đã giảm đi đáng kể lượng mã liên quan đến việc lưu trữ dữ liệu. Tuy nhiên, các phần hiện thực repository được tạo ra khi chạy bởi Spring Data vẫn thực hiện đầy đủ mọi thao tác mà các repository sử dụng JdbcTemplate từng làm. Thực tế, chúng thậm chí còn có tiềm năng làm được nhiều hơn, bởi vì hai interface repository này mở rộng CrudRepository, vốn cung cấp hàng tá thao tác để tạo, đọc, cập nhật và xóa các đối tượng.

Released under the MIT License.