【问题标题】:JPA merge() doesn't work as expected when resaving a modified object重新保存修改的对象时,JPA merge() 无法按预期工作
【发布时间】:2020-06-06 01:21:30
【问题描述】:

这是我为实体设置的:

@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
}

当我将新的Actor 添加到电影列表时,我能够成功调用entityManager.merge()。以下成功持久化了表。

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】:

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

    transaction 被提交,或者如果持久化上下文被刷新,那么对象将在数据库中更新。

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

    就你的情况而言,你没有提交事务。

    entityManager.getTransaction().commit();
    

    【讨论】:

      【解决方案2】:

      参见EntityManager 接口方法flush() 的javadoc。您可以使用它将持久性上下文同步到底层数据库

      如果FlushModeType 设置为COMMIT,则在整个事务提交时更新底层数据库。要解决此问题,您可以 setFlushModeAUTO (Default) 刷新每个查询。或者您可以将部分代码包装到 NESTED transaction 中以仅刷新这部分。您还可以在当前事务中定期调用flush() 方法:

      entityManager.flush();
      entityManager.clear();
      

      【讨论】:

        猜你喜欢
        • 2017-11-20
        • 2012-08-17
        • 1970-01-01
        • 2012-04-18
        • 2021-11-28
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多