我目前遇到一些麻烦,将对象写入数据库。我的问题确实出现在一个相当复杂的数据模型中,但我会尝试将其分解为一个可以理解的示例。假设有 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#persistCaused by: org.hibernate.HibernateException: Found shared references to a collection: random.package.structure.A.b在我的研究中,我发现,在提供相同的条目时可能会导致错误(不要与具有相同条目混淆)。显然,这源于jpa本身对A实例的初始化?!似乎,回收相同的是一个好主意,但是在更新未更改的对象时显然会引起问题...CollectionCollectionCollection清除之前保留的对象似乎可以解决问题。但是,由于所有内容都是懒惰的,因此以后使用这些对象会导致其他问题。EntityManager对于如何为每个 A 实例创建新 s 或以其他方式防止故障,您是否有任何提示?Collection提前非常感谢,如果我确实错过了任何信息,请直接询问!
添加回答
举报
0/150
提交
取消