13.2.1 定义文档类型
与前面一样,我们需要定义应用程序实体的相关类。我们将使用 Spring Data MongoDB 的 @Document
注解,就像我们在第 4 章中所做的那样,表明它们是要存储在 MongoDB 中的文档。让我们先从 Ingredient 类开始,如清单 13.12 所示。
清单 13.12 为 Mongo 持久化的 Ingredient 类。
package tacos;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
@Document
public class Ingredient {
@Id
private String id;
private String name;
private Type type;
public static enum Type {
WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
}
}
您可能敏锐的发现这个 Ingedient 类与我们在第 4 章中创建的类是相同的。事实上,MongoDB @Document
类确实完全一致,无论是通过响应式还是非响应式方式进行持久化。这意味着 Taco 和 TacoOrder 类也与我们在第 4 章中创建的是相同的。但是为了完整性,以便您不需要回到第 4 章,我们在这里列出。
清单 13.13 中显示了 Taco 类。
清单 13.13 为 Mongo 持久性添加注解的 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.mongodb.core.mapping.Document;
import org.springframework.data.rest.core.annotation.RestResource;
import lombok.Data;
@Data
@RestResource(rel = "tacos", path = "tacos")
@Document
public class Taco {
@Id
private String id;
@NotNull
@Size(min = 5, message = "Name must be at least 5 characters long")
private String name;
private Date createdAt = new Date();
@Size(min=1, message="You must choose at least 1 ingredient")
private List<Ingredient> ingredients = new ArrayList<>();
public void addIngredient(Ingredient ingredient) {
this.ingredients.add(ingredient);
}
}
注意,与 Ingredient 不同,Taco 类没有用 @Document
注解。那是因为它不会保存为自己的文档,而是保存为 TacoOrder 聚合根的一部分。另一方面,由于 TacoOrder 是聚合根,因此它用@Document
注解,如清单 13.14 所示。
清单 13.14 为 Mongo 持久化注解的 TacoOrder 类。
package tacos;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.Data;
@Data
@Document
public class TacoOrder implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String id;
private Date placedAt = new Date();
private User user;
private String deliveryName;
private String deliveryStreet;
private String deliveryCity;
private String deliveryState;
private String deliveryZip;
private String ccNumber;
private String ccExpiration;
private String ccCVV;
private List<Taco> tacos = new ArrayList<>();
public void addTaco(Taco taco) {
this.tacos.add(taco);
}
}
同样,对于响应式 MongoDB Repository 与非响应式 MongoDB Repository, 文档类没有什么不同。正如您接下来将看到的,响应式 MongoDB Repository 本身与非响应性的 MongoDB Repository 也只有很小的区别。