休眠:脏检查和仅更新脏属性?

2022-09-02 21:25:24

在“古老的JDBC时代”,我编写了很多SQL代码,这些代码只对实际更改的“属性/成员”进行了非常有针对性的更新:

例如,考虑具有以下成员的对象:

public String name;
public String address;
public Date date;

如果仅在某些业务方法中进行了更改,我只会为成员发出SQL。dateUPDATEdate

然而,似乎(这是我对Hibernate的“印象”)当使用标准的Hibernate映射(映射整个类)时,即使只更新一个成员也会导致Hibernate生成的SQL语句中对象的完整更新。

我的问题是:

  1. 这个观察是否正确,Hibernate不会智能地检查(在完全映射的类中),哪些成员被更改,然后只为特定的已更改成员发布更新,而是始终更新(在生成的SQL Update语句中)所有映射的成员(在类中),即使它们没有被更改(以防由于一个成员被脏而使对象变脏...)

  2. 我该怎么做才能使Hibernate仅更新那些已更改的成员?我正在寻找一种解决方案,让Hibernate只更新实际更改的成员。

(我知道Hibernate在脏检查方面做了很多工作,但据我所知,这种脏检查只与识别整个对象是否脏有关,而不是单个成员是脏的。


答案 1

实际上,您可以在类映射中指定选项。它就是这样做的。更多信息请点击这里dynamic-updatedynamic-insert


答案 2

休眠只是更新你真正想要的

public class Person {

    private Integer id;

    public String name;
    public String address;
    public Date date;

    // getter's and setter's

}

然后你做这样的事情

Person person = (Person) sessionFactory.openSession().get(Person.class, personId);

person.setName("jean");

Hibernate足够聪明,知道只有名称属性已被更改。虽然您可以看到您的日志,如下所示

UPDATE PERSON (NAME, ADDRESS, DATE) VALUES (?, ?, ?);

由于Hibernate缓存每个实体的每个SQL(INSERT,UPDATE,SELECT)查询,因此它再次更新您真正想要的内容。


推荐