Hibernate对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例

时间:2014-09-02 10:37:50

标签: hibernate

错误:

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(在数据库中),即使我有这个错误。有什么想法吗?

1 个答案:

答案 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);