簡體   English   中英

重新保存修改后的 object 時,JPA 合並()無法按預期工作

[英]JPA merge() doesn't work as expected when resaving a modified object

這是我為實體設置的:

@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);

以上不起作用,我可以看到 object 正在調試模式下更新,但是當調用merge()時它不會更新數據庫。

我哪里錯了? 我認為如果已經存在,合並會更新。

實體管理器。 merge()操作用於將對分離的 object 所做的更改合並到持久性上下文中。 merge 不會直接將 object 更新到數據庫中,它會將更改合並到持久化上下文(事務)中。

transaction提交時,或者如果持久性上下文被刷新,那么 object 將在數據庫中更新。

對於你來說, merge不是必需的,盡管它經常被誤用。 要更新 object,您只需read它,然后通過其set方法change其 state,然后提交transaction EntityManager將找出所有已更改的內容並更新數據庫。 僅當您擁有persistence object 的分離副本時才需要merge

就您而言,您沒有提交交易。

entityManager.getTransaction().commit();

請參閱EntityManager接口的方法flush()的 javadoc。 您可以使用它將持久性上下文同步到底層數據庫

如果FlushModeType設置為COMMIT ,則在整個事務提交時更新底層數據庫。 要解決此問題,您可以將FlushMode 設置AUTO (Default)以刷新每個查詢。 或者您可以將部分代碼包裝到NESTED 事務中以僅刷新這部分。 您還可以在當前事務中定期調用flush()方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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