嵌套的@OneToOne -> @OneToMany 不填充@OneToMany 子对象

Nested @OneToOne -> @OneToMany not populating @OneToMany child object

问题总结:

我有三个具有以下关系的@entities: CustomerOrder -> @OneToOne -> Reservation -> @OneToMany -> ProductOrder.

当我调用控制器直接获取 CustomerOrder 时,CustomerOrder 和 Reservation 子对象被拉取。 List<ProductOrder> 保持为空。

如果我调用控制器直接获取 Reservation,那么 Reservation 下的 List<ProductOrder> 已完全填充。

当我打印出 Hibernate 为提取 List<ProductOrder> 生成的 SQL 时,SQL 实际上确实提取了适当的 ProductOrder 列表,但 spring 没有填充列表。

详情:

我有三个 类(为简洁起见省略了 getter 和 setter):

客户订单:

@Entity
public class CustomerOrder {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(
        name="id",referencedColumnName="customerOrderId",insertable=false, updatable=false)
private Reservation reservation;

}

预订

@Entity
public class Reservation {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

//Tie a reservation back to a customer order
private Long customerOrderId;

@OneToMany
@JoinColumn(name = "reservationId", 
    referencedColumnName="id", insertable=false, updatable=false)
private List<ProductOrder> productOrderList = new ArrayList<ProductOrder>();

}

产品订单:

@Entity
public class ProductOrder {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

private Long customerOrderId;

private Long reservationId;

}

我还有两个端点。一种可以直接获取预订,或者一种可以通过 customerOrder 获取预订:

@RequestMapping(value = "/customer-order/{id}", method = RequestMethod.GET)
public @ResponseBody CustomerOrder findOne(@PathVariable(value="id") Long id) {     

    return CustomerOrder customerOrder = customerOrderRepository.findOne(id);

}

@RequestMapping(value = "/reservation/{id}", method = RequestMethod.GET)
public @ResponseBody Reservation findOne(@PathVariable(value="id") Long id) {       

    return reservationService.findOne(id);

}

我正在使用 spring-引导版本 1.3。5.RELEASE 和 MySQL 5.6.23

我明白是怎么回事了。

最初,我让 Reservation 与 CustomerOrder 建立了 @OneToMany 关系。这意味着我的映射应该像这样使用:

@OneToMany
@JoinColumn(
        name="customerOrderId",referencedColumnName="id",insertable=false, updatable=false)
private List<Reservation> reservation;

然后我更改了我的代码以使用@OneToOne 映射。当我这样做时,我将我的连接列翻转为如下所示: @JoinColumn(name="id",referencedColumnName="customerOrderId",insertable=false, updatable=false)

这个动作是错误的。当我通过映射通过 CustomerOrder 对象获取预订对象时,由于不正确的 @JoinColumn 映射,它实际上得到了 错误的 预订对象。

正确的解决方案是修改我的 CustomerOrder @entity 使其具有引用 Reservation 的 ID。

我的客户订单 class 现在看起来像这样:

private Long reservationId;

@OneToOne
@JoinColumn(
        name="reservationId",referencedColumnName="id",insertable=false, updatable=false)
private Reservation reservation;

糟糕。