我遇到了JPA的删除问题,这是我的代码:
public deleteLine(int idLine) {
Line line = em.find(Line.class,idLine);
Header header = line.getHeader();
this.deleteLine(header,line);
}
public boolean deleteLine(Header header, Line line) {
try {
line.setIdArticle(null);
line.setDetail(DELETED_TAG);
line.setQuantity(0.0f);
em.merge(line);
header.getLineCollection().remove(line);
em.remove(line);
em.flush();
}
catch (Exception ex) {
LOG.log(Level.SEVERE, null, ex);
}
return true;
}
当我致电deleteLine()
时,我以idArticle
为null
的数据库行结束,详细信息等于DELETED_TAG
常量,quantity
等于{{ 1}}。但是尽管有0
,行仍然存在。
我已尝试在删除之前添加em.remove
,但我收到了line.setHeader(null)
,因为标题字段不能为ConstraintViolationException
。
显然,我做错了什么,但我无法弄清楚是什么。
有实体代码:
null
我已经通过JPQL(public class Header implements Serializable {
[...]
@OneToMany(cascade = CascadeType.ALL, mappedBy = "header")
private Collection<Line> lineCollection;
[...]
}
public class Line implements Serializable {
[...]
@JoinColumn(name = "header", referencedColumnName = "header")
@ManyToOne(optional = false)
private Header header;
[...]
}
)完成了删除行的测试,并且它有效地删除了该行。但是,当JPA执行提交时,由于JPA完成了DELETE FROM Linea WHERE idLinea=?
,该行重新出现。
有没有办法发现原因?显然,有一个生成插入的实体,但是我从头部删除了这条线,那么我该怎么做才能找出触发插入的内容?
答案 0 :(得分:3)
我弄清楚问题出在哪里:当用户删除一行时,我正在执行此操作
由于jpa如何工作,对头字段的修改迫使jpa跳过删除子节点(因为级联全部)或重新插入它,因为事实上,实体仍然存在并且休眠“走”并重建父节点 - 小孩树。
对于遇到同样问题的人,如果您想删除子项并在删除后更新父级,我找到的正确方法是:
对我来说,按照这个确切的顺序做事就解决了这个问题。