簡體   English   中英

JPA將實體的“多對多”字段值替換為其他值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM