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

休眠异常:由 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#persistCaused by: org.hibernate.HibernateException: Found shared references to a collection: random.package.structure.A.b在我的研究中,我发现,在提供相同的条目时可能会导致错误(不要与具有相同条目混淆)。显然,这源于jpa本身对A实例的初始化?!似乎,回收相同的是一个好主意,但是在更新未更改的对象时显然会引起问题...CollectionCollectionCollection清除之前保留的对象似乎可以解决问题。但是,由于所有内容都是懒惰的,因此以后使用这些对象会导致其他问题。EntityManager对于如何为每个 A 实例创建新 s 或以其他方式防止故障,您是否有任何提示?Collection提前非常感谢,如果我确实错过了任何信息,请直接询问!
查看完整描述

1 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

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



查看完整回答
反对 回复 2022-09-22
  • 1 回答
  • 0 关注
  • 87 浏览

添加回答

举报

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