在@OneToMany

问题描述

我的hybernate有问题 我有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的唯一约束 我的问题是,当我想删除种族时,使用

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个或更多孩子,则可以例外。

谢谢您的帮助!

解决方法

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

例如:

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/请阅读此处以更好地理解。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...