问题摘要:
我有三个具有以下关系的@entities: CustomerOrder - > @OneToOne - >预订 - > @OneToMany - > ProductOrder。
当我调用控制器直接获取CustomerOrder时,会拉出CustomerOrder和Reservation子对象。 List<ProductOrder>
仍为空。
如果我呼叫控制器直接获取预订,则预留下的List<ProductOrder>
已完全填充。
当我打印出Hibernate生成的用于获取List<ProductOrder>
的SQL时,该SQL实际上会拉出相应的ProductOrder列表,但是spring并没有填充列表。
详细信息:
我有三个类(为了简洁省略了getters和setter):
CustomerOrder:
@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-boot版本1.3.5.RELEASE与MySQL 5.6.23
答案 0 :(得分:1)
我弄清楚发生了什么。
最初我有预订与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。
我的CustomerOrder课程现在如下所示:
private Long reservationId;
@OneToOne
@JoinColumn(
name="reservationId",referencedColumnName="id",insertable=false, updatable=false)
private Reservation reservation;
Woops。