gpt4 book ai didi

java - 重新保存修改后的对象时,JPA 合并()无法按预期工作

转载 作者:行者123 更新时间:2023-12-01 08:53:18 25 4
gpt4 key购买 nike

这是我为实体设置的:

@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()当我添加一个新的 Actor到电影列表。以下成功持久化了表。

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

然后我想更新 Actor 的名字,所以我要做的就是这个。我无法更新已经持久化/现有的 Actor:

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

以上不起作用,我可以看到在 Debug模式下正在更新的对象但是当 merge()被称为它不更新数据库。

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

最佳答案

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

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

为您merge不是必需的,尽管它经常被误用。要更新一个对象,您只需要 read它,然后 change它的状态通过其set方法,然后提交 transaction . EntityManager将找出所有已更改的内容并更新数据库。 merge仅当您拥有 persistence 的独立副本时才需要目的。

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

entityManager.getTransaction().commit();

关于java - 重新保存修改后的对象时,JPA 合并()无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62226219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com