我将 hibernate 与 JPA 结合使用,并使用 struts 2 进行增删改查操作。我在删除涉及多对多关系的对象时遇到问题。 每当我删除该对象时,它都会抛出异常:
Caused by: org.postgresql.util.PSQLException: ERROR: update or delete on table "partnerpo" violates foreign key constraint "fk_4iij5i8ix39iaub6kk1oswwk6" on table "rsrc_partner"
Detail: Key (po_id)=(1) is still referenced from table "rsrc_partner".
这是我的注释:
资源和合作伙伴 PO 是涉及多对多关系的两个实体
在资源类中,我添加了以下几行:
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "Rsrc_Partner", joinColumns = {
@JoinColumn(name = "Rsrc_Partner_RsrCode", nullable = false, updatable = true) },
inverseJoinColumns = { @JoinColumn(name = "Rsrc_Partner_PartnerPOCode",
nullable = false, updatable = true) })
private Set<PartnerPO> partnerPO;
在 PartnerPO 类中,我添加了以下行:
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "partnerPO")
private Set<Resource> resources = new HashSet<Resource>(0);
请告诉我如何执行删除操作。另外,这里是我的 dao 实现供您引用:
Session session = HibernateUtils.getSessionFactory().openSession();
session.beginTransaction();
session.delete(session.load(Resource.class, rsrc.getResource_Id()));
session.getTransaction().commit();
session.flush();
最佳答案
短篇故事:删除 @ManyToMany
上的任何级联。
更长的故事:
我想说,映射 @ManyToMany
和 CascadeType
的工作效果比我们预期的有点令人惊讶。
在@OneToMany
甚至@ManyToOne
(对于级联来说不那么常见,但是......)我们可以使用Cascade来管理另一端……听起来很有道理。如果有一个角色集合,如果任何 .add()
或 .remove()
级联就好了...
在@ManyToMany
中...区别在于,我们确实有一个配对表。该表(对)由 Hibernate 管理。 永远。它确实级联,因为没有其他方法。
为@ManyToMany
设置级联实际上与有关配对表。正如上面提到的,它是关于另一端的。这很可能是我们不想要的。
因此,我们经常(我想说)不需要在@ManyToMany
上发生级联。只是配对表必须妥善管理。这是 Hibernate 的工作...无需关心这一点。
关于hibernate - 使用注释删除多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26291883/