![](/img/trans.png)
[英]JPA Many-to-Many Relationship with Users Entity Stored in a Different Database
[英]JPA replacing Many to Many field value of an Entity to a different value
我有一个称为Artwork
的实体,该实体有一个名为Artwork
的成员,它与另一个实体的映射关系如下。
@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存储库) artRepository.save(artwork)
请帮助我。
提前致谢!
尝试以下方法
对于Collection(List)
( artwork.setSubjects(new ArrayList<Subject>());
),您必须clear()
现有的。 发生这种情况是因为,如果Hibernate
从DB加载了实体(及其集合),它将“管理”它们。 跟踪他们的更改。 通常,在使用Hibernate时,最好不要setters for collections (lists, sets)
创建任何setters for collections (lists, sets)
。 仅创建吸气剂,并清除其返回的集合,即:
artwork.getSubject().clear();
另外,请使用orphan deletion
(即,从子对象的集合中删除子对象时删除子对象)。 在拥有实体中添加@OneToMany(orphanRemoval=true)
。
试试这个,我也试图保存一个具有oneToMany关系的人...我只是使用saveOrUpdate,并且在前端,即使该人编辑了他的详细信息,我也会调用相同的方法:
@Override
@Transactional
public void addPerson(Person p) {
if( session == null) {
session = this.sessionFactory.openSession();
}else {
session = this.sessionFactory.getCurrentSession();
}
session.saveOrUpdate(p);
session.flush();
}
为了保存一对多映射的实体,我这样做:在这里也可以更改画布的详细信息,这没关系,我调用相同的方法。
@Override
public void addCanvas(Canvas canvas, Person person) {
int id = person.getId();
if( session == null) {
session = this.sessionFactory.openSession();
}else {
session = this.sessionFactory.getCurrentSession();
}
Person person1 = (Person) session.get(Person.class,id);
person.getCanvas1().add(canvas);
canvas.setPerson1(person1);
session.merge(canvas);
session.flush();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.