gpt4 book ai didi

JavaEE TreeSet 导致 org.hibernate.TransientPropertyValueException

转载 作者:行者123 更新时间:2023-12-01 10:20:07 24 4
gpt4 key购买 nike

我有一个 A 类。A 有一个 B 的 TreeSet。B 有一个 C 的 TreeSet。C 有一个 D 的 HashSet。

我收到此异常:

Caused by: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : D.c -> 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;
}

注意:通常属性都是私有(private)的,并且有 getter 和 setter。实现了 Comparable 并重写了 equal 方法。

编辑:

<小时/>

安尼尔的回答是正确的。这似乎是问题所在,当树集重新排列其元素时,它会破坏向后引用,并且需要再次保留它们。这只是我最好的想法。我没有证明这一点,但是通过操纵数据(这样集合就不会自行排序),我可以让它工作。

最佳答案

当您的实体中有一个集合,并且该集合包含数据库中不存在的一个或多个项目时,就会发生这种情况。

对于上面的代码,它与 @ManyToOne 的 CASCADE 属性有关使用cascade = CascadeType.PERSIST,并测试结果。

关于JavaEE TreeSet 导致 org.hibernate.TransientPropertyValueException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35648081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com