[英]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_id
和userCode
在Entity Part
实现了equals和hashCode。 还有一个Entity Factory
,所有关联都从该Entity Factory
“开始”到其他实体。 因此,为了保存所有更改,只需执行命令即可:
session.update(factory);
除从零件中删除外,所有更改均已成功保存。 我做:
products.getParts.remove(part);
出现的问题是:
1)在某些情况下是part
从Set
不除去虽然相比于part
在Set
有equals
true
返回(该part
是在Set
根据等号,但它不被除去)
2)即使Set
的remove
成功完成,数据库中的记录也不会被删除。
根据上述确定,在这种情况下不使用查询来删除记录的最佳方法是什么?
您需要明确删除子项:
session.delete(part);
如下代码:
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();
使用休眠模式映射关系时,必须注意两个主要问题:
如果要使用集合管理关系,则有两个选择:
更改所有权。 像这样:
@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.