为了账号安全,请及时绑定邮箱和手机立即绑定

休眠异常:由 jpa 本身调用的共享引用 (?)

休眠异常:由 jpa 本身调用的共享引用 (?)

胡子哥哥 2022-09-22 10:31:11

我目前遇到一些麻烦,将对象写入数据库。我的问题确实出现在一个相当复杂的数据模型中,但我会尝试将其分解为一个可以理解的示例。


假设有 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


提前非常感谢,如果我确实错过了任何信息,请直接询问!


查看完整描述

1 回答

?
噜噜哒

TA贡献1465条经验 获得超6个赞

当然,这是一种关系。我改变了我的数据模型(使用映射表),这解决了我的问题!@ManyToMany



查看完整回答
反对 回复 2022-09-22

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信