嵌套的@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;
糟糕。
问题总结:
我有三个具有以下关系的@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;
糟糕。