我正在使用带有JPA的hibernate并使用struts 2进行crud操作。我在删除涉及多对多关系的对象时遇到了问题。 每当我删除对象时,它都会抛出异常:
引起:org.postgresql.util.PSQLException:错误:更新或删除表" partnerpo"违反外键约束" fk_4iij5i8ix39iaub6kk1oswwk6"在桌子上" rsrc_partner"
细节:键(po_id)=(1)仍然从表" rsrc_partner"中引用。
以下是我的注释:
资源和合作伙伴是涉及多对多关系的两个实体
在资源类中,我添加了以下行:
@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();
答案 0 :(得分:2)
短篇小说:删除@ManyToMany
上的任何级联。
更长的故事:
我会说,@ManyToMany
和CascadeType
的映射效果比我们预期的要差一些。
在@OneToMany
甚至是@ManyToOne
(不是通常用于级联,但是......)我们可以使用Cascade来管理另一端......这听起来很合理。如果有一组角色,那么如果任何.add()
或.remove()
进行级联就很好......
在@ManyToMany
......差别是,我们确实有一个配对表。该表(对)由Hibernate管理。 始终即可。它确实级联,因为没有别的办法。
设置@ManyToMany
的级联实际上不关于配对表。如上所述,关于另一端是。这很可能是我们做的不想要的。
所以,我们经常(我会说)不需要在@ManyToMany
上进行级联。只需配对表就可以正确管理。这是Hibernate的工作......不需要关心它。