java - 删除多对多关系中的所有内容 (JPA)

标签 java hibernate jpa orm many-to-many

我有以下模型(简化):

@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删除视频/所有视频,最好是删除所有视频并将删除级联到标签。

最佳答案

行动是:

  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();
    }
    

关于java - 删除多对多关系中的所有内容 (JPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35072434/

相关文章:

java - 从 selenium webdriver 中的消息中获取特定值

Java 泛型错误 : Cannot convert from E to E?

java - Jbehave 无法找到多个故事

java - HQL 嵌套子查询

java - 使用 JPA 将新实例添加到表中

java - 如何在运行 groovy 脚本 URL 时禁用 SSL 验证?

java - 使用具有与其列名称不同的属性名称的 query.setParameter

spring - 如何使用 Hibernate 配置多个模式

java - JsonView - 定义默认 View

mysql - Spring JPA 多对多关系加载缓慢