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

时间:2016-06-07 01:53:51

标签: spring hibernate spring-data one-to-many one-to-one

问题摘要:

我有三个具有以下关系的@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

1 个答案:

答案 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。