【发布时间】:2015-03-15 20:03:34
【问题描述】:
我有以下实体关系:
@Entity
@Table(name="order_info")
public class OrderInfo{
@OneToMany(mappedBy="orderInfo",fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JsonIgnore
private List<OrderItem> orderItems;
}
@Entity
@Table(name="reason_codes")
public class ReasonCode{
//bi-directional many-to-one association to OrderItem
@JsonIgnore
@OneToMany(mappedBy="reasonCode",fetch=FetchType.EAGER,cascade=CascadeType.ALL)
private List<OrderItem> orderItems;
}
@Entity
@Table(name="order_item")
public class OrderItem{
//bi-directional many-to-one association to OrderInfo
@ManyToOne
@JoinColumn(name="order_info_id", nullable=false)
private OrderInfo orderInfo;
//bi-directional many-to-one association to ReasonCode
@ManyToOne
@JoinColumn(name="reason_code_id", nullable=false)
private ReasonCode reasonCode;
}
每个 OrderInfo 有多个 OrderItem,每个 ReasonCode 可以映射到多个 OrderItem,每个 OrderItem 必须有 1 个 OrderInfo 和 1 个 ReasonCode。
最后,设置一切的代码:
class Test{
...
List<OrderItem> orderItems = new ArrayList<OrderItem>();
for(...){
OrderItem item = new OrderItem();
ReasonCode rrCode = rcRepostory.findOne("2");
item.setReasonCode(rrCode);
orderItems.add(item);
}
OrderInfo order = CreateOrder.create(orderItems);
orderInfoRepo.save(order);
}
class CreateOrder{
public static OrderInfo create(List<OrderItem> orderItems){
OrderInfo oInfo = new OrderInfo();
oInfo. setABC(...);
for(OrderItem item : orderItems){
item.setOrderInfo(oInfo);
}
oInfo.setOrderItems(orderItems);
return oInfo;
}
}
现在,当我尝试保存 orderInfo 实体时,出现以下错误:
Not-null property references a transient value - transient instance must be saved before current operation : model.OrderItem.reasonCode -> model.ReasonCode
基本上,我想做的是,当我保存 OrderInfo 时,我希望 OrderItems 也被保存。
从我在网上看到的许多帖子中,将 fetch 添加为渴望,并在多对一映射上级联应该可以解决此问题。但是,即使添加了它们,我仍然会遇到问题。
ReasonCode 已存在于数据库中。这里有什么问题?
谢谢。
【问题讨论】:
-
在 orderItem 的联合列使字段可以为空 @JoinColumn(name="reason_code_id", nullable=true)
-
@Harshal Patil 我无法设置 nullable=true。它是数据库中的非空字段。
标签: spring hibernate orm spring-data-jpa