我有Order
有......
private Collection<OrderCustomField> orderCustomFields;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
public Collection<OrderCustomField> getOrderCustomFields() {
return orderCustomFields;
}
@JsonProperty("CustomFields")
public void setOrderCustomFields(Collection<OrderCustomField> orderCustomFields) {
this.orderCustomFields = orderCustomFields;
}
OrderCustomFields
已
private Order order;
@ManyToOne
@javax.persistence.JoinColumn(name = "order_id", referencedColumnName = "id", nullable = false)
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
保存订单时,order_id
中未填充OrderCustomField
。我认为cascade = CascadeType.ALL
会处理填充这些值。有没有我错过的东西,或者那是不是我认为的那样?
答案 0 :(得分:1)
当hibernate需要存储与数据库的双向关系并且存在冲突的信息(一方引用另一方但反之亦然),那么Hibernate依赖于关系的拥有方面。通过在mappedBy="order"
上指定@OneToMany
,您宣布许多方面是该关系的拥有方。
如果你把它关掉,那么拥有方就是关系的一方(这是一对多关系的默认),你会得到你想要的行为。
但是,Hibernate建议您始终设置关系的两个方面。这是因为在实体进入数据库并重新加载之前,另一半不会被填充。换句话说,只要打开二级缓存,就会出现麻烦,因为在缓存从数据库重新加载实体之前,order字段将为null。
答案 1 :(得分:1)
在这种情况下,@PrePresist
为我工作......
@PrePersist
public void beforeCreate() {
if(created == null)
created = new Timestamp(System.currentTimeMillis());
for(OrderCustomField orderCustomField : getOrderCustomFields())
orderCustomField.setOrder(this);
}