JPA不会删除数据库行

时间:2014-08-18 14:04:45

标签: java hibernate jpa

我遇到了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()时,我以idArticlenull的数据库行结束,详细信息等于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=?,该行重新出现。

有没有办法发现原因?显然,有一个生成插入的实体,但是我从头部删除了这条线,那么我该怎么做才能找出触发插入的内容?

1 个答案:

答案 0 :(得分:3)

我弄清楚问题出在哪里:当用户删除一行时,我正在执行此操作

  • call deleteLine
  • 进行一些计算并使用结果更新标题

由于jpa如何工作,对头字段的修改迫使jpa跳过删除子节点(因为级联全部)或重新插入它,因为事实上,实体仍然存在并且休眠“走”并重建父节点 - 小孩树。

对于遇到同样问题的人,如果您想删除子项并在删除后更新父级,我找到的正确方法是:

  • 从父集合中删除子项
  • 更新标题
  • 删除孩子

对我来说,按照这个确切的顺序做事就解决了这个问题。