繁体   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