我遇到了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
等于0
。但是,尽管,该行仍然存在em.remove
。
我尝试line.setHeader(null)
在删除之前添加,但是我得到了,ConstraintViolationException
因为标头字段不能为null
。
显然我做错了,但是我无法弄清楚是什么。
有实体代码:
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;
[...]
}
我已经完成了通过JPQL(DELETE FROM Linea WHERE idLinea=?
)删除行的测试,并且可以有效地删除行。但是随后,当JPA进行提交时,由于JPA的完成,该行再次出现INSERT
。
有办法发现原因吗?显然,有一个实体会生成插入内容,但是我要删除标题中的行,那么我该怎么做才能找出触发插入内容的原因呢?
我发现问题出在哪里:当用户删除一行时,我正在这样做
由于jpa的工作原理,对标头字段的修改迫使jpa跳过删除子项(由于全部级联)或重新插入它,因为实际上该实体仍然存在并休眠“漫游”并重建父子树。
对于面临相同问题的人们,如果要删除孩子并在删除后更新父母,我找到的正确方法是:
对我来说,按照这种精确的顺序进行操作可以解决问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句