我有一个A类.A的树集为B. B的树集为C. C的HashSet为D.
我得到了这个例外:
引起:org.hibernate.TransientPropertyValueException:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:D.c - > ç
我理解为什么我通常会得到那个例外。但在这种情况下我真的无法想象为什么,因为当我将B.cSortedSet的类型更改为普通集时,它将起作用。有人有想法吗?
可以在这里找到具有更好可读性的课程:
@Entity
public class A extends SortableEntity {
@OneToMany(mappedBy = „a“, cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
@OrderBy("sortOrder")
public SortedSet<B> bSortedSet = new TreeSet<>();
}
@Entity
public class B extends SortableEntity {
@OneToMany(mappedBy = „b“, cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
@OrderBy("sortOrder")
public SortedSet<C> cSortedSet = new TreeSet<>(); // Wont work.
// public Set<C> cSet = new HashSet<>(); // Will work.
@ManyToOne
public A a;
}
@Entity
public class C extends SortableEntity {
@OneToMany(mappedBy = „c“, cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
public Set<D> dSet = new HashSet<>();
@ManyToOne
public B b;
}
@Entity
public class D {
@ManyToOne
public C c;
}
@MappedSuperClass
public abstract class D {
@ManyToOne
public Integer sortOrder;
}
注意:通常,属性都是私有的,并且它们具有getter和setter。实现了可比较,并且重写了相同的方法。
修改
Anil的回答是正确的。这似乎是问题,当树集重新排列它的元素时,它会破坏后向引用,它们需要再次持久化。这是我最好的想法。我没有证明这一点,但是通过操纵数据(以便集合不必自行排序),我可以使它工作。
答案 0 :(得分:1)
如果您的实体中有一个集合,并且该集合中有一个或多个项目不在数据库中,则会发生这种情况。
对于上面的代码,它与@ManyToOne的CASCADE属性有关 使用cascade = CascadeType.PERSIST,并测试结果。