![](/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.