繁体   English   中英

删除与Hibernate关联的OneToMany上的记录

[英]Delete a record on an OneToMany association with Hibernate

我正在使用Hibernate应用程序,我想删除数据库中的某些记录。 相关实体是:

@Entity
public class Product {

    private String serialNumber;
    private Set<Part> parts = new HashSet<Part>();

    @Id
    public String getSerialNumber() { return serialNumber; }
    void setSerialNumber(String sn) { serialNumber = sn; }

    @OneToMany
    public Set<Part> getParts() { return parts; }
    void setParts(Set parts) { this.parts = parts; }

    ...
}


@Entity
public class Part implements Serializable {

    @Id
    @GeneratedValue
    private Long part_id;

    private String userCode = "";

       //getters and setters
       ....


}

我已经让Eclipse基于part_iduserCodeEntity Part实现了equals和hashCode。 还有一个Entity Factory ,所有关联都从该Entity Factory “开始”到其他实体。 因此,为了保存所有更改,只需执行命令即可:

session.update(factory);

除从零件中删除外,所有更改均已成功保存。 我做:

products.getParts.remove(part);

出现的问题是:

1)在某些情况下是partSet不除去虽然相比于partSetequals true返回(该part是在Set根据等号,但它不被除去)

2)即使Setremove成功完成,数据库中的记录也不会被删除。

根据上述确定,在这种情况下不使用查询来删除记录的最佳方法是什么?

您需要明确删除子项:

session.delete(part);

Hibernate Docs中

如下代码:

 Parent p = (Parent) session.load(Parent.class, pid); Child c = (Child) p.getChildren().iterator().next(); p.getChildren().remove(c); c.setParent(null); session.flush(); 

不会从数据库中删除c。 在这种情况下,它将仅删除到p的链接,并导致违反NOT NULL约束。 您需要显式delete()子级。

 Parent p = (Parent) session.load(Parent.class, pid); Child c = (Child) p.getChildren().iterator().next(); p.getChildren().remove(c); session.delete(c); session.flush(); 

使用休眠模式映射关系时,必须注意两个主要问题:

  • 关系的所有者是谁? 所有者是关系的一方,其更改将保留在数据库中。 在您的情况下,所有者是Part对象。
  • 是真正的父母/子女关系,还是仅仅是构成关系? 在您的情况下,我认为答案是构图

如果要使用集合管理关系,则有两个选择:

  • 使用@ElementCollection而不是@OnetoMany
  • 更改所有权。 像这样:

     @OneToMany @JoinColumn(name="part_id") public Set<Part> getParts() { return parts; } void setParts(Set parts) { this.parts = parts; } 

但是, 此处不建议第二种选择。 参见第2.2.5.3.1.2节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM