JPA merge()在保存修改后的对象时无法正常工作

问题描述 投票:2回答:1

这是我为实体设置的

@Entity
@Getter
@Setter
@Table(name = "movies", schema = "public")
public class Movie {
    @Id
    @Column(name = "id")
    private UUID movieId;

    @OneToMany(mappedBy = "actor", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Set<Actors> actors = new HashSet<>();

    //Getters and setters
    }
}
@Entity
@Getter
@Setter
@Table(name = "actors_movies", schema = "public")
public class ActorMovie {

    @EmbeddedId
    private ActorId id;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("movieId")
    @JoinColumn(name = "id_movie_movie")
    private Movie movie;

    //Getters and setters below
}

我能够成功地将entityManager.merge()' when I add a new Actor`调用到电影列表中。以下代码成功保留了表。

Movie movie = getMovieById(id);
movie.setActors(new Actor());
entityManager.merge(movie);

然后,我想更新演员名称,所以我要做的就是这个。我无法更新已经存在/已经存在的Actor:

Movie movie = getMovieById(id);
movie.getActors().get(0).setName("New Name");
entityManager.merge(movie);

上面的方法不起作用,我可以看到对象正在调试模式下更新,但是当调用merge()时,它不会更新数据库。

我要去哪里错了?我认为合并会更新(如果已经存在)。

java jpa persistence javax.persistence
1个回答
0
投票

[EntityManager。 merge()操作用于将对分离的对象所做的更改合并到持久性上下文中。 合并不会直接将对象更新到数据库中,它将更改合并到持久性上下文(事务)中。

[提交transaction时,或者刷新持久性上下文时,该对象将在数据库中更新。

对于您来说merge不是必需的,尽管它经常被滥用。要更新一个对象,您只需要read它,然后通过change方法使其set其状态,然后提交transactionEntityManager将找出所有已更改的内容并更新数据库。仅当具有merge对象的分离副本时,才需要persistence

在您的情况下,您不打算进行交易。

entityManager.getTransaction().commit();
© www.soinside.com 2019 - 2024. All rights reserved.