Hibernate: лучший способ обновить объект - PullRequest
3 голосов
/ 30 января 2012

Допустим, у меня есть:

// all objects have valid mapping to database
public class A {
   private int id;
   private String name;
   private List<B> chidlren1;
   private List<C> children2;
}

в методе обновления моего контроллера я должен обновить определенный объект, но новые значения для него я сохраняю в переменной сеанса, как другой объект A.

Итак, вопрос в том, какой действительный способ обновить этот конкретный объект из другого объекта?Является ли следующий код действительным?

A old = dao.get(id);
A temp = getFromSession();

old.Name = temp.Name;
old.Children1 = temp.Children1;
old.Children2 = temp.Children2;
dao.update(old);

И еще один вопрос - если правильный метод previoud верен, спящий режим сначала удалит все записи из таблиц chidlren и добавит новые, либо он может автоматически обновлять / вставлять новые записи и удалятьудаленные?

Спасибо

UPD # 1: Допустим, детские коллекции temp отличаются от детских коллекций старой?

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Если идентификаторы установлены правильно в ваших дочерних коллекциях сущностей типа A и B, и вы указали cascade=MERGE для этих сущностей, вы сможете использовать метод merge , например:,

A updatedEntity = dao.merge(yourObjectFromTheHttpSession);

Тем не менее, мне пришлось вручную сверять связанные коллекции, чтобы должным образом обрабатывать новые входящие сущности и удалять существующие сущности в прошлом, и я не мог полагаться на спящий режим, чтобы автоматически заботиться обо всем,поэтому YMMV.

Из документов:

Скопируйте состояние данного объекта в постоянный объект с тем же идентификатором.Если в данный момент нет постоянного экземпляра, связанного с сеансом, он будет загружен.Вернуть постоянный экземпляр.Если данный экземпляр не сохранен, сохраните копию и верните ее как новый постоянный экземпляр.Данный экземпляр не становится связанным с сеансом.Эта операция распространяется на связанные экземпляры, если сопоставление сопоставляется с помощью cascade = "merge".

Семантика этого метода определяется JSR-220.

0 голосов
/ 30 января 2012

Я согласен с Ракешем. если вы все еще сомневаетесь в его отмене, вы можете установить "show_sql = true" (режим гибернации), вы увидите строку sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...