Будьте в спящем режиме: грязная проверка и только обновление грязных атрибутов?

В "старые добрые дни JDBC" я записал много кода SQL, который сделал очень целенаправленные обновления только "атрибутов/участников", которые были на самом деле изменены:

Например, рассмотрите объект со следующими членами:

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

Если только date был изменен в некотором Бизнес-методе, я только выпущу SQL UPDATE для date участник.

Это кажется однако (это - мое "впечатление" от, в спящем режиме), что при работе со стандартом В спящем режиме, отображаясь (отображение полного класса), даже обновления только единственного членского вывода к полному обновлению объекта в SQL-операторах, сгенерированных, в спящем режиме.

Мои вопросы:

  1. Это корректное наблюдение, которые В спящем режиме, разумно не проверяет (в полностью отображенном классе), какой участник (участники), где изменено и затем только выпускают обновления для определенных измененных участников, а скорее всегда будет обновлять (в сгенерированном Операторе Обновления SQL) всех отображенных участников (класса), даже если они не были изменены (в случае, если объект грязен из-за одного участника, являющегося грязным...),

  2. Что я могу сделать для создания, в спящем режиме, только обновляют тех участников, которые были изменены? Я ищу решение иметь, в спящем режиме, только обновляют участника, который на самом деле изменился.

(Я знаю, в спящем режиме, делает некоторую работу над грязной проверкой, но насколько я знаю, что эта грязная проверка только релевантна, чтобы определить, грязен ли объект как целый, не, какой единственный участник грязен.)

17
задан Daniel Serodio 26 March 2013 в 21:56
поделиться

2 ответа

Фактически, вы можете указать параметры динамическое обновление и динамическая вставка в сопоставлении классов. Это так и есть. Подробнее здесь .

15
ответ дан 30 November 2019 в 13:34
поделиться

Hibernate просто обновите то, что вы действительно хотите

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 достаточно умен, чтобы знать, что было изменено только свойство name. Хотя вы можете увидеть свой журнал следующим образом

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

, поскольку Hibernate кеширует каждый запрос SQL (INSERT, UPDATE, SELECT) для КАЖДОЙ сущности, опять же, он просто обновляет то, что вы действительно хотите.

5
ответ дан 30 November 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: