当前位置: 首页 > 知识库问答 >
问题:

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

田嘉澍
2023-03-14

错误:

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;
}

我还尝试了cascadetype.all,但是

org.hibernate.PropertyValueException: not-null property references a null or transient value: com.SomeObject

病因是什么?显然,我设置了nullable=true(在数据库中也是如此),尽管我有这个错误。有什么想法吗?

共有1个答案

马涵蓄
2023-03-14

假设您有一个order实体与orderline实体具有onetomany关系。现在,如果您没有设置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

要解决此问题,必须在保存订单之前保存订单行

session.save(orderLine);
session.save(order);
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);
 类似资料: