【问题标题】:Nested @OneToOne -> @OneToMany not populating @OneToMany child object嵌套 @OneToOne -> @OneToMany 不填充 @OneToMany 子对象
【发布时间】:2016-06-07 01:53:50
【问题描述】:

问题总结:

我有三个具有以下关系的@entities: CustomerOrder -> @OneToOne -> 预订 -> @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);

}

我正在使用带有 MySQL 5.6.23 的 spring-boot 版本 1.3.5.RELEASE

【问题讨论】:

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


    【解决方案1】:

    我知道发生了什么。

    最初,我让 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。

    我的 CustomerOrder 类现在看起来像这样:

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

    哎呀。

    【讨论】:

      猜你喜欢
      • 2016-12-10
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 2017-10-03
      相关资源
      最近更新 更多