我有一个名为Artwork的实体,该实体具有名为subject的成员,该成员与另一个实体的映射关系如下。

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<ArtSubject> subjects;


假设在我的Artwork表中,我有一条记录,其主题值为(ArtSubject1, ArtSubject2, ArtSubject3)

我必须用(ArtSubject5, ArtSubject6, ArtSubject7)替换该值。

完全不同的列表。

如果我将带有新数据的Artwork对象另存为(ArtSubject5, ArtSUbject6, ArtSubject7),则很隐秘。

JPA将其附加到已经存在的列表中,并且结果数据为(ArtSubject1, ArtSubject2, ArtSubject3, ArtSubject5, ArtSUbject6, ArtSubject7)

我只希望它是(ArtSubject5, ArtSubject6, ArtSubject7)

请找到我保存ArtSubject并将其设置为Artwork对象的方法。

ArtWork artwork = new ArtWork();
        List<ArtSubject> subject = new ArrayList<>();
        List<ArtStyle> style = new ArrayList<>();
        Artist artist = new Artist();
        List<ArtCollection> artCollections = new ArrayList<>();

        // Classifying Collections into each category.
        for (Collection collection : collections) {
            String tokens[] = collection.getTitle().split("_");
            if (tokens == null || tokens.length < 2) {
                LOGGER.info("Invalid Collection Type: Collection type {} not recognised",
                        collection.getTitle());
                continue;
            }
            String collectionType = tokens[0];
            switch(collectionType) {
            case "subject":
                ArtSubject artSubject = new ArtSubject(collection.getId(),
                        collection.getTitle().split("_")[1]);
                subject.add(artSubject);
                artSubjectRepository.save(artSubject);
                break;
            default:
                LOGGER.info("Invalid Collection Type: Collection type {} not recognised",
                        collection.getTitle());
                break;
            }
        }


        artwork.setSubject(subject);


之后,我将图稿另存为artRepository(CRUD Repository)artRepository.save(artwork)
请帮我解决一下这个。

提前致谢!

最佳答案

尝试以下方法

对于Collection(List)artwork.setSubjects(new ArrayList<Subject>());),您必须clear()现有的。发生这种情况是因为,如果Hibernate从DB加载实体(及其集合),它将“管理”它们。跟踪他们的更改。通常,使用Hibernate时最好不要创建任何setters for collections (lists, sets)。仅创建吸气剂,并清除其返回的集合,即:

artwork.getSubject().clear();


另外,请使用orphan deletion(即,从父级集合中删除子对象时删除子对象)。在拥有实体中添加@OneToMany(orphanRemoval=true)

07-24 21:10