我有一个名为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)
。