保存不相关的实体时,Spring Boot Hibernate TransientPropertyValueException

时间:2018-03-20 12:50:06

标签: java spring hibernate spring-boot spring-data-jpa

我在将包含OneToOne关系的实体保存到跟踪对象时遇到问题,该实体具有未保存的更改,但实际引用为空。

@Entity
public class Item {

    ... other fields

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "item"
    @JoinColumn(name = "itemId", referencedColumn = "id", nullable = false)
    private Set<ItemFieldData> dataSet;
}

@Entity
public class ItemFieldData {

    @ManyToOne(cascade = CascadeType.ALL)
    private Item item;
}

@Entity
public class TxnLog {

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "itemId")
    private Item item;

}

这些是我的实体的简化版本。方案如下。

  • 我查找了一个项目
  • 我创建了一个新的TxnLog(项目引用为空)
  • 我创建了新的ItemFieldData并将其添加到我查找的项目中。我不保存/冲洗
  • 我保存/清除对TxnLog进行的一些更改
  • 抛出TransientPropertyValueException

以下代码示例: -

Item item = itemRepo.findOne(itemId);
TxnLog txnLog = new TxnLog();
txnLog.setSomeFields();

ItemFieldData data = new ItemFieldData("some data");
item.addItemFieldData(data); //inserts into the Set

txnLogRepo.saveAndFlush(txnLog); //txnLog has no reference to my managed item entity yet. When stepping through the code, item in TxnLog is null.

此时抛出异常: -

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.items.ItemFieldData.field -> com.items.ItemField; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.items.ItemFieldData.field -> com.items.ItemField

所以我的问题是,为什么我的托管跟踪实体中未保存/未刷新的更改会抛出此异常,而不是正在保存和刷新的实体?

此外,在保存TxnLog时,即使它确实引用了非null的Item,我也不希望保存级联到项目。因此在TxnLog.item上没有CasecadeType。

提前致谢。

0 个答案:

没有答案