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,里边提供了十几种用于创建、读取、更新和删除对象的方法。