В "старые добрые дни JDBC" я записал много кода SQL, который сделал очень целенаправленные обновления только "атрибутов/участников", которые были на самом деле изменены:
Например, рассмотрите объект со следующими членами:
public String name;
public String address;
public Date date;
Если только date
был изменен в некотором Бизнес-методе, я только выпущу SQL UPDATE
для date
участник.
Это кажется однако (это - мое "впечатление" от, в спящем режиме), что при работе со стандартом В спящем режиме, отображаясь (отображение полного класса), даже обновления только единственного членского вывода к полному обновлению объекта в SQL-операторах, сгенерированных, в спящем режиме.
Мои вопросы:
Это корректное наблюдение, которые В спящем режиме, разумно не проверяет (в полностью отображенном классе), какой участник (участники), где изменено и затем только выпускают обновления для определенных измененных участников, а скорее всегда будет обновлять (в сгенерированном Операторе Обновления SQL) всех отображенных участников (класса), даже если они не были изменены (в случае, если объект грязен из-за одного участника, являющегося грязным...),
Что я могу сделать для создания, в спящем режиме, только обновляют тех участников, которые были изменены? Я ищу решение иметь, в спящем режиме, только обновляют участника, который на самом деле изменился.
(Я знаю, в спящем режиме, делает некоторую работу над грязной проверкой, но насколько я знаю, что эта грязная проверка только релевантна, чтобы определить, грязен ли объект как целый, не, какой единственный участник грязен.)
Фактически, вы можете указать параметры динамическое обновление
и динамическая вставка
в сопоставлении классов. Это так и есть. Подробнее здесь .
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) для КАЖДОЙ сущности, опять же, он просто обновляет то, что вы действительно хотите.