【问题标题】:delete children without update them before @OneToMany在@OneToMany 之前删除子级而不更新它们
【发布时间】:2023-03-17 21:54:01
【问题描述】:

我遇到了休眠问题 我有 2 个这样的课程:

public Class Race {
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="race", orphanRemoval = true)
    private List<Lap> laps = new ArrayList<>(0);
    ...
}

public Class Lap {
   @ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.REFRESH)
   @JoinColumn(name = "RACE_ID", nullable = false)
    private Race race;

   @OneToOne(mappedBy = "nextLap", fetch = FetchType.LAZY)
   private Lap previousLap;

   @OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
   @JoinColumn(name = "NEXT_ID")
   private Lap nextLap;
 ...
}

在我的数据库中,我还有一个具有 NEXT_ID 和 RACE_ID 的唯一约束 我的问题是当我想删除我的 Race 时,使用

txn = session.getTransaction();
txn.begin();
race = session.merge(race);
session.remove(race);
session.flush(); //=>Exception here
txn.commit();

我得到了结果:

javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException:不能 执行批处理 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188) 在 org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1364) 在 org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1347) 在 package.DAORace.deleteRace(DAORace.java:122)

原因:java.sql.BatchUpdateException: ORA-00001: 唯一约束 (LAP_UK1) 违规

当我删除比赛并且违反了我的约束时,Hibernate 会在我的膝上进行更新。 我的问题是当我删除父级时如何正确删除子级而不更新?

注意:如果我只有一个孩子,我可以毫无例外地删除它,如果我有2个或更多孩子,我有一个例外。

感谢您的帮助!

【问题讨论】:

    标签: java hibernate constraints persistence one-to-many


    【解决方案1】:

    要将实体作为级联删除,最好的方法是通过几个查询来删除它们。

    例如:

    em.createQuery("delete from Lap p where p.race.id = :id).setParameter("id", id).executeUpdate();
    
    em.createQuery("delete from Race r where r.id = :id).setParameter("id", id).executeUpdate();
    

    https://thorben-janssen.com/avoid-cascadetype-delete-many-assocations/ 阅读此处以获得更好的理解。

    【讨论】:

    • 感谢您的回答,我认为它会起作用,但实际上我的 Lap 对象下有很多对象要作为级联删除(但没有唯一约束)编写查询将是一个如果我忘记删除一个实体会有点乏味和危险我认为hibernate可以正确地做到这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    相关资源
    最近更新 更多