[英]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.