java - 重新保存修改后的对象时,JPA 合并()无法按预期工作
问题描述
这是我为实体设置的:
@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:
Movie movie = getMovieById(id);
movie.getActors().get(0).setName("New Name");
entityManager.merge(movie);
以上不起作用,我可以看到在调试模式下正在更新的对象但是当merge()
被调用时它不会更新数据库。
我哪里错了?我认为如果已经存在,合并会更新。
解决方案
实体管理器。merge()
操作用于将对分离对象所做的更改合并到持久性上下文中。合并不直接将对象更新到数据库中,它会将更改合并到持久性上下文(事务)中。
当transaction
提交时,或者如果持久性上下文被刷新,那么对象将在数据库中更新。
For youmerge
不是必需的,尽管它经常被误用。要更新一个对象,你只需要read
它,然后change
通过它的set
方法更新它的状态,然后提交transaction
. 将EntityManager
找出所有已更改的内容并更新数据库。merge
仅当您拥有persistence
对象的分离副本时才需要。
就您而言,您没有提交交易。
entityManager.getTransaction().commit();
推荐阅读
- php - 任何远程用户使用 youtube api 将视频上传到 youtube
- mysql - mysql在更新时触发,保持列高于其他
- python - 如何让 tkinter 画布对象绕圈移动
- c# - 有限制的 2D 随机点
- android - google play 对我的 android 应用程序的否定回复
- python - 具有连续无界输入的 Python ThreadPoolExecutor
- python - Python子进程:使用不关闭的`stdin`启动进程
- android - 是否可以在 AppBarLayout 中折叠多个视图?
- python - 遍历 2 个列表并在相应位置返回值
- javascript - 点击按钮不起作用 - >转换