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 也只有很小的区别。

results matching ""

    No results matching ""