我有这个复杂的数据模型。 A类有B,C,D类型的集合。 E是D和C之间的连接表.F是D和B之间的连接表。
我从D(cascade.All)中保存了E和F.由于E包含对C的引用而F包含对B的引用,因此在继续保存D之前,我需要将它们保存(id生成)。
所以这是我的保存令。
saveAndFlush(A)(我希望声明冲洗A(B和C),因为它们应该从A级联。
保存(D)当我运行它时,我得到以下异常。
引起:java.lang.IllegalStateException:org.hibernate.TransientPropertyValueException:object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:E.c - > ç
我在第2步之前检查了eclipse中的集合a.bSet和a.cSet,集合中的那些元素没有生成Id。
我尝试将第1步拆分为
我还尝试使用@Transactional(propagation = REQUIRES_NEW)将1,2,3移动到不同的服务方法,但仍然是同样的问题。
非常感谢任何帮助。
class A{
@OneToMany(mappedBy = "a", cascade={CascadeType.ALL}, orphanRemoval=true)
@JsonIgnore
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<B> bSet = new HashSet<>();
@OneToMany(mappedBy = "a", cascade={CascadeType.ALL}, orphanRemoval=true)
@JsonIgnore
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<C> cSet = new HashSet<>();
@OneToMany(mappedBy = "a", cascade={CascadeType.REMOVE , CascadeType.DETACH}, orphanRemoval=true)
@JsonIgnore
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private List<D> dSet = new ArrayList<>();
}
class B{
@ManyToOne
private A a;
}
class C{
@ManyToOne
private A a;
}
class D{
@OneToMany(mappedBy = "d", cascade = CascadeType.ALL)
@JsonIgnore
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<E> e = new HashSet<>()
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "d")
private F f;
@ManyToOne
private A a;
}
/*E is join table between D and C*/
class E{
@ManyToOne
private D d;
@ManyToOne
private C c;
}
/*F is join table between D and B*/
class F{
@OneToOne
@JoinColumn(name="d_id")
private D d;
@ManyToOne
private B b;
}