Hibernate:脏检查和只更新脏属性?

jen*_*ens 17 java hibernate

在"好旧的JDBC时代"中,我编写了许多SQL代码,只对实际更改的"属性/成员"进行了非常有针对性的更新:

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

public String name;
public String address;
public Date date;
Run Code Online (Sandbox Code Playgroud)

如果仅date在某些Business Method中更改,我只会UPDATE为该date成员发出SQL .

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

我的问题是:

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

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

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

Mau*_*rry 15

其实,你可以指定的选项dynamic-update,并dynamic-insert在类的映射.就是这样.更多信息在这里.


Art*_*ald 5

Hibernate 只是更新你真正想要的东西

public class Person {

    private Integer id;

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

    // getter's and setter's

}
Run Code Online (Sandbox Code Playgroud)

而你做的事情就像

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

person.setName("jean");
Run Code Online (Sandbox Code Playgroud)

Hibernate非常聪明,只知道名称属性已被更改.虽然您可以看到您的日志如下

UPDATE PERSON (NAME, ADDRESS, DATE) VALUES (?, ?, ?);
Run Code Online (Sandbox Code Playgroud)

因为Hibernate再次为每个实体缓存每个SQL(INSERT,UPDATE,SELECT)查询,它只是更新你真正想要的东西.