Java 响应不包括关联

Java 响应不包括关联,java,hibernate,rest,spring-boot,jpa,Java,Hibernate,Rest,Spring Boot,Jpa,我正在开发一个SpringBootRESTAPI。 我有以下两个Hibernate实体: 订单实体 @Table(name = "orders") @Getter @Setter public @Entity class OrderEntity extends AbstractPersistable<Long> { private static final long serialVersionUID = 1780337491454957180L; @Column(

我正在开发一个SpringBootRESTAPI。 我有以下两个Hibernate实体:

订单实体

@Table(name = "orders")
@Getter
@Setter
public @Entity class OrderEntity extends AbstractPersistable<Long> {

    private static final long serialVersionUID = 1780337491454957180L;

    @Column(name = "order_number")
    @Setter(value = AccessLevel.NONE)
    private String orderId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    private UserEntity user;

    @Digits(integer = 10, fraction = 2)
    @Column(name = "total_amount")
    @Range(min = 0, message = "The total amount must be greater or equals to zero.")
    private BigDecimal totalAmount = BigDecimal.ZERO;

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<OrderDetailEntity> items = new HashSet<>();

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(nullable = false, name = "card_details_id")
    private CardDetailsEntity card;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(nullable = false, name = "shipping_address_id")
    private AddressEntity shippingAddress;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(nullable = true, name = "billing_address_id")
    private AddressEntity billingAddress;

    @Column(name = "one_address", columnDefinition = "BOOLEAN")
    private boolean oneAddress;

    public void addOrderDetail(OrderDetailEntity detail) {
        items.add(detail);
    }

    @Override
    public String toString() {
        StringBuffer buffer = new StringBuffer();
        buffer.append(orderId).append(" (").append(totalAmount).append(") ");
        items.forEach(i -> buffer.append(i.getProduct().getName()).append("; qty: ").append(i.getQuantity())
                .append("; amount: ").append(i.getTotalAmount()).append(System.lineSeparator()));
        return buffer.append("]").toString();
    }

    public void setOrderId(UUID uuid) {
        orderId = uuid.toString();
    }
}
@Table(name = "order_detail")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PUBLIC)
public @Entity class OrderDetailEntity extends AbstractPersistable<Long> {

    private static final long serialVersionUID = 8128749778263610480L;

    @Column(name = "quantity")
    private Integer quantity;

    @Digits(integer = 10, fraction = 2)
    @Column(name = "total_amount")
    @Range(min = 0, message = "The total amount must be greater or equals to zero.")
    private BigDecimal totalAmount = BigDecimal.ZERO;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id")
    @JsonBackReference
    private OrderEntity order;

    @OneToOne(optional = false)
    @JoinColumn(name = "product_id")
    private ProductEntity product;
}
@Table(name = "product")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PUBLIC) @AllArgsConstructor
public @Entity class ProductEntity extends AbstractPersistable<Long> {

    private static final long serialVersionUID = -5077959382034660336L;

    @NotEmpty
    @Column(name = "product_name", length = 254)
    private String name;

    @NotEmpty
    @Column(name = "product_description", length = 254)
    private String description;

    @Digits(integer = 12, fraction = 2)
    @Column(name = "product_price")
    @Range(min = 0, message = "The price must be greater or equals to 0.")
    private BigDecimal price;

    @NotEmpty
    @Column(name = "image_url", length = 254)
    private String imageUrl;

    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(name = "product_category_id")
    @JsonBackReference
    @JsonIgnore
    private CategoryEntity category;

    @OneToMany(mappedBy = "product", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @BatchSize(size = 10)
    @OrderBy
    private SortedSet<ProductThumbnailEntity> thumbnails;

    public ProductEntity(Long id) {
        this.setId(id);
    }

    public ProductEntity(String name, String description, BigDecimal price) {
        this.name = name;
        this.description = description;
        this.price = price;
    }
}
@Table(name = "address")
@Getter @Setter
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public @Entity class AddressEntity extends AbstractEntity<Long> {

    private static final long serialVersionUID = 1544232699919709073L;

    @Size(max = 254)@Column(name = "street_address")
    private String streetAddress;

    @Size(max = 50)
    private String country;

    @Size(max = 40)
    private String city;

    @Size(max = 100)
    private String state;

    @Size(max = 16) @Column(name = "postal_code")
    private String postalCode;
}
我收到了以下结果:

[ {
  "quantity" : 1,
  "totalAmount" : 105.00,
  "new" : false
} ]
它不包括
产品
参考,只包括字段数量和
总金额

此外,如果我发出以下请求:

curl -X GET "http://localhost:8080/users/1/orders/d329cba4-5ead-4f5d-9663-557e99ab46f1"
curl -X GET "http://localhost:8080/users/1/orders"

[ {
  "created" : "2018-05-12T14:02:00",
  "orderId" : "d329cba4-5ead-4f5d-9663-557e99ab46f1",
  "totalAmount" : 105.00,
  "card" : {
    "created" : "2018-05-12T14:02:00",
    "brand" : "American Express",
    "expMonth" : 2,
    "expYear" : 2022,
    "last4" : "0005",
    "new" : false,
    "links" : [ ],
    "content" : [ ],
    "links" : [ ]
  },
  "shippingAddress" : {
    "modified" : "2018-05-12T14:02:00",
    "created" : "2018-05-12T14:02:00",
    "streetAddress" : "test",
    "country" : "Netherlands",
    "city" : "test",
    "state" : "test",
    "postalCode" : "test",
    "new" : false,
    "links" : [ ],
    "content" : [ ],
    "links" : [ ]
  },
  "billingAddress" : {
    "modified" : "2018-05-12T14:02:00",
    "created" : "2018-05-12T14:02:00",
    "streetAddress" : "test",
    "country" : "Netherlands",
    "city" : "test",
    "state" : "test",
    "postalCode" : "test",
    "new" : false,
    "links" : [ ],
    "content" : [ ],
    "links" : [ ]
  },
  "oneAddress" : true,
  "new" : false
} ]
此响应不包含我也需要从响应中获取的
字段,即使存在与任何订单关联的项。 有什么问题?为什么上面引用的字段未包含在响应中

多谢各位

编辑

我试图在
OrderDetailEntity
中添加以下字段:

@OneToOne
@JoinColumn(name = "address_id")
private AddressEntity address;
然后将正确序列化:

curl  -X GET "http://localhost:8080/users/1/orders/2f8254e6-b04a-4fb0-baae-cb27fcd11a87"

[ {
  "quantity" : 1,
  "totalAmount" : 10.99,
  "address" : {
    "streetAddress" : "aa",
    "country" : "Netherlands",
    "city" : "aa",
    "state" : "a",
    "postalCode" : "a",
    "modified" : "2018-05-12T18:49:48",
    "created" : "2018-05-12T18:49:48",
    "new" : false,
    "links" : [ ],
    "content" : [ ],
    "links" : [ ]
  },
  "id" : 8,
  "new" : false
但ProductEntity未序列化。以下是两个实体。我无法理解其中的区别。也许ProductEntity包含其他关联(AddressEntity不包含),这可能会以某种方式影响序列化

ProductEntity

@Table(name = "orders")
@Getter
@Setter
public @Entity class OrderEntity extends AbstractPersistable<Long> {

    private static final long serialVersionUID = 1780337491454957180L;

    @Column(name = "order_number")
    @Setter(value = AccessLevel.NONE)
    private String orderId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    private UserEntity user;

    @Digits(integer = 10, fraction = 2)
    @Column(name = "total_amount")
    @Range(min = 0, message = "The total amount must be greater or equals to zero.")
    private BigDecimal totalAmount = BigDecimal.ZERO;

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<OrderDetailEntity> items = new HashSet<>();

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(nullable = false, name = "card_details_id")
    private CardDetailsEntity card;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(nullable = false, name = "shipping_address_id")
    private AddressEntity shippingAddress;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(nullable = true, name = "billing_address_id")
    private AddressEntity billingAddress;

    @Column(name = "one_address", columnDefinition = "BOOLEAN")
    private boolean oneAddress;

    public void addOrderDetail(OrderDetailEntity detail) {
        items.add(detail);
    }

    @Override
    public String toString() {
        StringBuffer buffer = new StringBuffer();
        buffer.append(orderId).append(" (").append(totalAmount).append(") ");
        items.forEach(i -> buffer.append(i.getProduct().getName()).append("; qty: ").append(i.getQuantity())
                .append("; amount: ").append(i.getTotalAmount()).append(System.lineSeparator()));
        return buffer.append("]").toString();
    }

    public void setOrderId(UUID uuid) {
        orderId = uuid.toString();
    }
}
@Table(name = "order_detail")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PUBLIC)
public @Entity class OrderDetailEntity extends AbstractPersistable<Long> {

    private static final long serialVersionUID = 8128749778263610480L;

    @Column(name = "quantity")
    private Integer quantity;

    @Digits(integer = 10, fraction = 2)
    @Column(name = "total_amount")
    @Range(min = 0, message = "The total amount must be greater or equals to zero.")
    private BigDecimal totalAmount = BigDecimal.ZERO;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id")
    @JsonBackReference
    private OrderEntity order;

    @OneToOne(optional = false)
    @JoinColumn(name = "product_id")
    private ProductEntity product;
}
@Table(name = "product")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PUBLIC) @AllArgsConstructor
public @Entity class ProductEntity extends AbstractPersistable<Long> {

    private static final long serialVersionUID = -5077959382034660336L;

    @NotEmpty
    @Column(name = "product_name", length = 254)
    private String name;

    @NotEmpty
    @Column(name = "product_description", length = 254)
    private String description;

    @Digits(integer = 12, fraction = 2)
    @Column(name = "product_price")
    @Range(min = 0, message = "The price must be greater or equals to 0.")
    private BigDecimal price;

    @NotEmpty
    @Column(name = "image_url", length = 254)
    private String imageUrl;

    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(name = "product_category_id")
    @JsonBackReference
    @JsonIgnore
    private CategoryEntity category;

    @OneToMany(mappedBy = "product", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @BatchSize(size = 10)
    @OrderBy
    private SortedSet<ProductThumbnailEntity> thumbnails;

    public ProductEntity(Long id) {
        this.setId(id);
    }

    public ProductEntity(String name, String description, BigDecimal price) {
        this.name = name;
        this.description = description;
        this.price = price;
    }
}
@Table(name = "address")
@Getter @Setter
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public @Entity class AddressEntity extends AbstractEntity<Long> {

    private static final long serialVersionUID = 1544232699919709073L;

    @Size(max = 254)@Column(name = "street_address")
    private String streetAddress;

    @Size(max = 50)
    private String country;

    @Size(max = 40)
    private String city;

    @Size(max = 100)
    private String state;

    @Size(max = 16) @Column(name = "postal_code")
    private String postalCode;
}
@表(name=“product”)
@Getter@Setter
@noargsconstuctor(access=AccessLevel.PUBLIC)@allargsconstuctor
public@Entity类ProductEntity扩展了AbstractPersistable{
私有静态最终长serialVersionUID=-5077959382034660336L;
@空空如也
@列(name=“product_name”,长度=254)
私有字符串名称;
@空空如也
@列(name=“product_description”,长度=254)
私有字符串描述;
@数字(整数=12,分数=2)
@列(name=“产品价格”)
@范围(最小值=0,消息=“价格必须大于或等于0。”)
私人价格;
@空空如也
@列(name=“image\u url”,长度=254)
私有字符串imageUrl;
@ManyToOne(可选=false,fetch=FetchType.EAGER)
@JoinColumn(name=“产品类别id”)
@JsonBackReference
@杰索尼奥雷
私有类别实体类别;
@OneToMany(mappedBy=“product”,fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@批量大小(大小=10)
@订货人
私有分类集缩略图;
公共产品实体(长id){
这个.setId(id);
}
public ProductEntity(字符串名称、字符串描述、BigDecimal价格){
this.name=名称;
this.description=描述;
这个价格=价格;
}
}
地址实体

@Table(name = "orders")
@Getter
@Setter
public @Entity class OrderEntity extends AbstractPersistable<Long> {

    private static final long serialVersionUID = 1780337491454957180L;

    @Column(name = "order_number")
    @Setter(value = AccessLevel.NONE)
    private String orderId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    private UserEntity user;

    @Digits(integer = 10, fraction = 2)
    @Column(name = "total_amount")
    @Range(min = 0, message = "The total amount must be greater or equals to zero.")
    private BigDecimal totalAmount = BigDecimal.ZERO;

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<OrderDetailEntity> items = new HashSet<>();

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(nullable = false, name = "card_details_id")
    private CardDetailsEntity card;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(nullable = false, name = "shipping_address_id")
    private AddressEntity shippingAddress;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(nullable = true, name = "billing_address_id")
    private AddressEntity billingAddress;

    @Column(name = "one_address", columnDefinition = "BOOLEAN")
    private boolean oneAddress;

    public void addOrderDetail(OrderDetailEntity detail) {
        items.add(detail);
    }

    @Override
    public String toString() {
        StringBuffer buffer = new StringBuffer();
        buffer.append(orderId).append(" (").append(totalAmount).append(") ");
        items.forEach(i -> buffer.append(i.getProduct().getName()).append("; qty: ").append(i.getQuantity())
                .append("; amount: ").append(i.getTotalAmount()).append(System.lineSeparator()));
        return buffer.append("]").toString();
    }

    public void setOrderId(UUID uuid) {
        orderId = uuid.toString();
    }
}
@Table(name = "order_detail")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PUBLIC)
public @Entity class OrderDetailEntity extends AbstractPersistable<Long> {

    private static final long serialVersionUID = 8128749778263610480L;

    @Column(name = "quantity")
    private Integer quantity;

    @Digits(integer = 10, fraction = 2)
    @Column(name = "total_amount")
    @Range(min = 0, message = "The total amount must be greater or equals to zero.")
    private BigDecimal totalAmount = BigDecimal.ZERO;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id")
    @JsonBackReference
    private OrderEntity order;

    @OneToOne(optional = false)
    @JoinColumn(name = "product_id")
    private ProductEntity product;
}
@Table(name = "product")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PUBLIC) @AllArgsConstructor
public @Entity class ProductEntity extends AbstractPersistable<Long> {

    private static final long serialVersionUID = -5077959382034660336L;

    @NotEmpty
    @Column(name = "product_name", length = 254)
    private String name;

    @NotEmpty
    @Column(name = "product_description", length = 254)
    private String description;

    @Digits(integer = 12, fraction = 2)
    @Column(name = "product_price")
    @Range(min = 0, message = "The price must be greater or equals to 0.")
    private BigDecimal price;

    @NotEmpty
    @Column(name = "image_url", length = 254)
    private String imageUrl;

    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(name = "product_category_id")
    @JsonBackReference
    @JsonIgnore
    private CategoryEntity category;

    @OneToMany(mappedBy = "product", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @BatchSize(size = 10)
    @OrderBy
    private SortedSet<ProductThumbnailEntity> thumbnails;

    public ProductEntity(Long id) {
        this.setId(id);
    }

    public ProductEntity(String name, String description, BigDecimal price) {
        this.name = name;
        this.description = description;
        this.price = price;
    }
}
@Table(name = "address")
@Getter @Setter
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public @Entity class AddressEntity extends AbstractEntity<Long> {

    private static final long serialVersionUID = 1544232699919709073L;

    @Size(max = 254)@Column(name = "street_address")
    private String streetAddress;

    @Size(max = 50)
    private String country;

    @Size(max = 40)
    private String city;

    @Size(max = 100)
    private String state;

    @Size(max = 16) @Column(name = "postal_code")
    private String postalCode;
}
@表(name=“address”)
@Getter@Setter
@EqualsAndHashCode(callSuper=false)
@NoArgsConstructor(access=AccessLevel.PROTECTED)
@AllArgsConstructor
public@Entity类AddressEntity扩展了AbstractEntity{
私有静态最终长serialVersionUID=154423269919709073L;
@列(name=“street\u address”)的大小(max=254)
私有字符串streetAddress;
@尺寸(最大值=50)
私人国家;
@尺寸(最大值=40)
私人城市;
@尺寸(最大值=100)
私有字符串状态;
@大小(最大值=16)@列(名称=“邮政编码”)
专用字符串后代码;
}

您是否已在items getter上添加了
@JsonIgnore
?@emotionlessbananas我已尝试将JsonIgnore添加到getter方法,但没有成功。不管怎样,为什么?杰索尼诺?我想检索项目,而不是忽略项目。您可以将“获取类型”设置为OrderEntity中的“项目集”字段,以便将它们与订单一起获取。@AbhayJain它不起作用:/same result您不需要在查询中执行左联接。将查询更改为“从OrderEntity o中选择o,其中o.user.email=?1”