gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:38:10 25 4
gpt4 key购买 nike

我有以下模型(简化):

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com