[英]JAVA Hibernate merge is updating and not merging
当我使用merge时,我希望休眠将不会将非null值复制到持久化的实体并更新数据库。 因此,在下面的用例中,我希望合并将保持lastName
的值为Last_0
并将firstName
更改为值First_1
。
但是实际上,休眠只是在更新,这意味着在代码执行后, lastName
变为null
@Transactional
public void create() {
SomeEntity create = new SomeEntity();
create.setFirstName("First_0");
create.setLastName("Last_0");
this.getSession().save(create);
//now in the database id:1, firstName:First_0, lastName:Last_0
}
@Transactional
public void merge() {
SomeEntity merge = new SomeEntity();
merge.setId(1);
merge.setFirstName("First_1");
this.getSession().merge(merge);
// now in the database id:1, firstName:First_1, lastName:null
}
create();
merge();
我希望lastName
具有Last_0
的值,因为它正在合并。 但它为空。
谢谢
您对在实践中如何实现Hibernate的merge()
感到困惑。 在这种情况下, merge()
是通过SQL UPDATE
,其含义类似于以下内容:
UPDATE some_entity
SET
firstName = 'First_1',
lastName = NULL
WHERE
id = 1;
也就是说,它将使用您的分离实体碰巧拥有的任何内容覆盖所有字段值。 请注意,如果不存在具有此主键id=1
记录,则Hibernate将INSERT
,而不是进行更新。
如果要开始使用实体的原始值,则应该使用get:
SomeEntity merge = (SomeEntity) this.getSession().get(SomeEntity.class, 1);
merge.setFirstName("First_1");
this.getSession().merge(merge);
现在,原始名称将“粘贴”,除了名字(被覆盖其他名称)之外。
如果您希望休眠仅保存部分字段,而并非所有字段都使用@DynamicUpdate
此处的示例: https : //www.baeldung.com/spring-data-jpa-dynamicupdate
如里面所贴:
实际上,当我们在实体上使用@DynamicUpdate时,Hibernate不会将缓存的SQL语句用于更新。 相反,每次我们更新实体时,它将生成一条SQL语句。 此生成的SQL仅包含已更改的列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.