hibernate - 使用注释删除多对多关系

标签 hibernate many-to-many

我将 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 上的任何级联。

更长的故事:
我想说,映射 @ManyToManyCascadeType 的工作效果比我们预期的有点令人惊讶。

@OneToMany甚至@ManyToOne(对于级联来说不那么常见,但是......)我们可以使用Cascade来管理另一端……听起来很有道理。如果有一个角色集合,如果任何 .add().remove() 级联就好了...

@ManyToMany中...区别在于,我们确实有一个配对表。该表(对)由 Hibernate 管理。 永远。它确实级联,因为没有其他方法。

@ManyToMany设置级联实际上有关配对表。正如上面提到的,它是关于另一端的。这很可能是我们想要的。

因此,我们经常(我想说)不需要在@ManyToMany上发生级联。只是配对表必须妥善管理。这是 Hibernate 的工作...无需关心这一点。

关于hibernate - 使用注释删除多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26291883/

相关文章:

java - 从 IntelliJ IDEA 将 Java Web 应用程序部署到 Heroku

c# - EF Core - 类中的多对多关系

mysql - 如何从控制台使用 Rails 3 事件记录插入多对多表

hibernate @ManyToOne仅适用于CascadeType.ALL

java - 复合主键和数据截断错误

mysql - Spring boot Multi-Tenancy ,一个租户连接到多个模式

java - Hibernate 5.2.9 :@Basic(fetch = FetchType. LAZY) 不起作用

SQL 多对多选择与链接表

java - 使用命名查询时 ManyToMany NOT NULL 检查约束

java - 在 hibernate 中更新父对象时多对多关系出现问题?