使用注释删除多对多关系

时间:2014-10-10 04:19:51

标签: hibernate many-to-many

我正在使用带有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();

1 个答案:

答案 0 :(得分:2)

短篇小说:删除@ManyToMany上的任何级联。

更长的故事:
我会说,@ManyToManyCascadeType的映射效果比我们预期的要差一些。

@OneToMany甚至是@ManyToOne (不是通常用于级联,但是......)我们可以使用Cascade来管理另一端......这听起来很合理。如果有一组角色,那么如果任何.add().remove()进行级联就很好......

@ManyToMany ......差别是,我们确实有一个配对表。该表(对)由Hibernate管理。 始终即可。它确实级联,因为没有别的办法。

设置@ManyToMany的级联实际上关于配对表。如上所述,关于另一端是。这很可能是我们做的想要的。

所以,我们经常(我会说)不需要在@ManyToMany上进行级联。只需配对表就可以正确管理。这是Hibernate的工作......不需要关心它。