【发布时间】:2015-11-11 13:43:44
【问题描述】:
我有以下实体:
@Entity
public class Parent {
@Id
@Column(name = "ID", nullable = false)
private Long id;
}
@Entity
public class Child {
@Id
@Column(name = "ID", nullable = false)
private Long id;
private Parent parent;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "PARENT_ID", referencedColumnName = "ID", updatable = false, insertable = false)
public Parent getParent() {
return parent;
}
}
现在,当我保存子项时,我想将父项的 ID 保存到“PARENT_ID”列中。
但是我不想在保存子项时保存或更新父项。
因此,我已将 updatable = false, insertable = false 添加到 @JoinColumn。
问题是,这样我得到“org.hibernate.TransientPropertyValueException:对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例”。
所以 Hibernate 告诉我在 Child 之前先保存 Parent。好吧,Parent 已经保存了,但是 Hibernate 不知道,因为它是一个新事务,我不想要
再次保存父级(这就是updatable = false, insertable = false 的重点)。我也不想再次获取父项(没有额外的选择,我只需要 ID(我已经拥有)而不是整个对象)
我已经尝试使用 @Transient 注释 getParent 以防止 Parent 的持久化,这很好用,但是当获取 Child 时,Parent 不是。
(我用我手动设置的另一个属性保存了 ID)
有什么方法可以实现我想要的吗?
(取子时取父,保存子时保存ParentID,但不保存或更新父)
【问题讨论】:
标签: java hibernate jpa spring-data