3.2.3 为持久化注解领域实体

我们唯一需要做的另一件事是为领域实体添加注解,这样 Spring Data JDBC 就可以知道如何进行持久化了。一般来说,这意味着使用 @Id 指定标识属性 —— 这样 Spring Data 将知道哪个字段表示对象的标识 —— 并且可以选择在类上使用 @Table 注解。例如,TacoOrder 类用了 @Table@Id 注解,如下所示:

清单 3.15 为持久化准备 Taco 类。

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;

  // ...

}

注解 @Table 是可选的。默认情况下,对象将映射到一个数据库表,表名是对象的类名称。在本例中,TacoOrder 映射到一个名为“TacoOrder”的表上。如果这对您来说是合适的,您就完全不用添加 @Table 注解,或者即使使用也不添加任何参数。但如果希望将对象映射到其他的表名上,则可以使用 @Table 参数来指定表名称,如下所示:

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

如图所示,TacoOrder 将映射到一个名为“Taco_Cloud_Order”的表上。至于 @Id 注解,它将 Id 属性指定为 TacoOrder 的标识。TacoOrder 中的所有其他属性,将根据其属性名称自动映射到列上。例如,deliveryName 属性将自动映射到名为“delivery_name”的列上。如果要显式定义列名,您可以使用 @Column 注解的参数进行指定:

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

您还需要将 @Table@Id 注解应用于其他领域实体类。如 Ingredient 类:

清单 3.16 为持久化准备 Ingredient 类。

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;

  // ...

}

还有 Taco 类:

清单 3.17 为持久化准备 Taco 类。

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;

  // ...

}

至于 IngredientRef,它将自动映射到名为“Ingredient_Ref”的表上,这非常适合我们的应用。如果需要,可以使用 @Table 注解对其进行调整,但这完全不必要。“"Ingredient_Ref”表没有标识列,因此无需在 IngredientRef 中使用 @Id 注解。

有了这些小小的改变,更不用说完全移除的 JdbcIngredientRepository 和 JdbcOrderRepository 类,您现在进行持久化的代码要少很多了。即使如此,它仍然完成了使用 JdbcTemplate 的存储库所做的一切。事实上,还可以做更多的事情,因为这两个存储库接口扩展自 CrudRepository,里边提供了十几种用于创建、读取、更新和删除对象的方法。

results matching ""

    No results matching ""