【问题标题】:delete everything in a many-to-many relationship (JPA)删除多对多关系(JPA)中的所有内容
【发布时间】:2016-05-06 11:23:41
【问题描述】:

我有以下模型(减少):

@Entity
public class Video {
    @ManyToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    @JoinTable(name = "video_tag", joinColumns = {
            @JoinColumn(name = "video_id", referencedColumnName = "id") }, inverseJoinColumns = {
                    @JoinColumn(name = "tag_id", referencedColumnName = "id") })
    private Set<Tag> tags;
}

@Entity
public class Tag {
    @ManyToMany(mappedBy="tags", fetch=FetchType.LAZY)
    private Set<Video> videos;
}

我有一个数据库,其中视频连接到多个标签,反之亦然。我想删除所有视频并将其级联以删除所有标签。在视频实体上调用 remove 会导致一个循环,在标签和视频之间来回来回几轮之后,java 编译器会打印循环的堆栈转储。

如何使用 JPA 删除视频/所有视频,最好是通过删除所有视频并将删除级联到标签。

【问题讨论】:

  • 您要删除 a 视频,还是所有视频和所有标签?这是完全不同的。删除视频时不能删除视频的标签,因为标签可能被其他视频引用。级联删除 ManyToXxx 关联是没有意义的。如果目标是从三个表中删除所有内容,我只需要 3 个 SQL 查询。
  • 我想使用 JPA 删除数据库中的所有内容(所有标签和所有视频)
  • 那我只使用 3 个 SQL 查询:delete from video_tag; delete from video; delete from tag;
  • 看起来你正在寻找 repoObj.deleteAllInBatch();

标签: java hibernate jpa orm many-to-many


【解决方案1】:

动作是:

  1. 分解关系(对象架构)
  2. 更新所有者实体(本例中为视频)
  3. 删除视频实体也会删除标签实体,因为视频类中的级联注释。

    //Remove relationships
    List<Video> videoList;
    for (Video v : videoList) {
        for(Tag t : video.getTags()){
            t.getVideos.remove(v);
            v.getTags.remove(t);
        }
    }
    
    //Update owner entities
    for (Video v : videoList) {
        Session sess = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = sess.beginTransaction();
        sess.update(v);
        tx.commit();
        sess.close();
    }
    
    //Remove owner entities
    for (Video v : videoList) {
        Session sess = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = sess.beginTransaction();
        sess.delete(v);
        tx.commit();
        sess.close();
    }
    

【讨论】:

    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2021-07-12
    相关资源
    最近更新 更多