错误:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.SomeObject
代码:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SOMEOBJECTID", nullable = true, insertable=true, updatable=true)
public SomeObject getSomeObject() {
return this.someObject;
}
public void setSomeObject(SomeObject someObject) {
this.someObject= someObject;
}
我有一个表单,其中需要或不需要someObject。
不幸的是,我收到上述错误
我也试过CascadeType.ALL
,但是
org.hibernate.PropertyValueException: not-null property references a null or transient value: com.SomeObject
原因是什么?显然我设置nullable = true(在数据库中),即使我有这个错误。有什么想法吗?
答案 0 :(得分:2)
假设您的Order
实体与OneToMany
个实体有OrderLine
个关系。现在,如果您没有设置CASCADE
属性,那么当您尝试保存这样的Order
实体时:
Order order = new Order();
OrderLine orderLine = new OrderLine();
order.setOrderLine(orderLine);
session.save(order);
然后你会得到一个例外说:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing
要解决此问题,您必须在保存OrderLine
之前保存Order
:
session.save(orderLine);
session.save(order);
现在,如果您有双向关系,并且如果您尝试设置CASCADE
属性并执行相同的操作:
Order order = new Order();
OrderLine orderLine = new OrderLine();
order.setOrderLine(orderLine);
session.save(orderLine);
session.save(order);
然后你会得到一个例外:
org.hibernate.PropertyValueException: not-null property references a null or transient value
因为orderLine
具有order
的属性,在这种情况下为null
,因为我们没有设置值。因此,为了解决这个问题,您需要通过添加额外的一行来正确维护两侧的关系:
orderLine.setOrder(order);