问题描述
我的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/请阅读此处以更好地理解。