我目前遇到一些麻烦,将对象写入数据库。我的问题确实出现在一个相当复杂的数据模型中,但我会尝试将其分解为一个可以理解的示例。
假设有 A 类:
@Entity(name = "a")
@Table(schema = "foo")
public class A {
private static final long serialVersionUID = -5305374150112492804L;
logger = LoggerFactory.getLogger(A.class);
@Id
@Column(name = "tid", nullable = false, unique = true)
@SequenceGenerator(name = "globalSequenceGen", schema = "foo", sequenceName = "foo_sequence")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "globalSequenceGen")
private Integer TID;
@Column(name = "b")
private String bId;
@OneToMany(targetEntity = B.class)
@JoinColumn(name = "random_b_attribute", referencedColumnName = "b", updatable = false, insertable = false)
private List<B> b;
@PrePersist
@PreUpdate
public void prePersist() {
bId = b == null || b.isEmpty() ? null : b.get(0).getRandomAttribute();
}
...
}
引用的类 B 非常简单:它只包含带注释的属性。请注意,A 的实例可以并且将在其属性中引用 B的相同“集合”。@Columnb
问题来了:
我确实从数据库中检索D的对象(懒惰)。它们都不引用A的任何对象(例如,数据库中的列a为空)。
我确实从数据库中检索了A的所有对象,就像我后来想将它们插入D实例(也是懒惰的)一样。EntityManager
我不碰任何或属性。D#aA#b
尝试任何新创建的 D 实例最终都会得到以下异常:EntityManager#persist
Caused by: org.hibernate.HibernateException: Found shared references to a collection: random.package.structure.A.b
在我的研究中,我发现,在提供相同的条目时可能会导致错误(不要与具有相同条目混淆)。显然,这源于jpa本身对A实例的初始化?!似乎,回收相同的是一个好主意,但是在更新未更改的对象时显然会引起问题...CollectionCollectionCollection
清除之前保留的对象似乎可以解决问题。但是,由于所有内容都是懒惰的,因此以后使用这些对象会导致其他问题。EntityManager
对于如何为每个 A 实例创建新 s 或以其他方式防止故障,您是否有任何提示?Collection
提前非常感谢,如果我确实错过了任何信息,请直接询问!
噜噜哒
相关分类