gpt4 book ai didi

JAVA Hibernate合并是更新而不是合并

转载 作者:行者123 更新时间:2023-12-02 01:14:20 25 4
gpt4 key购买 nike

当我使用合并时,我希望 hibernate 会将非空值复制到持久实体并更新数据库。因此,在下面的用例中,我希望合并将 lastName 保留为值 Last_0 并将 firstName 更改为值 First_1

但实际上,hibernate 只是更新,这意味着 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);

现在,原始值将“保留”,但名字除外,它被其他内容覆盖。

关于JAVA Hibernate合并是更新而不是合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57667932/

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