2012-01-30 3 views
3

позволяет, что у меня есть:Hibernate: лучший способ обновить объект

// 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 метод является правильным, будет зимовать сначала удалить все записи из таблиц и акций, и игровых добавить новые или он может автоматически обновлять/добавлять новые записи и удалить удаленные из них?

Спасибо

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

+0

'dao.update (old)' фактически обновит текущую запись, если она существует. Новая запись не вставлена. – Rakesh

+0

Я говорил о сборниках сыщиков и рядах рядовых детей. См. UPD # 1 – nKognito

+1

Он не удаляет ** все ** записи из дочерней таблицы. Потому что у него будут записи для нескольких экземпляров 'A'. Но он изменит таблицу, чтобы отразить изменения, внесенные в текущий экземпляр 'A'. Для этого, если записи не находятся в новой коллекции, они удалят их. –

ответ

2

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

A updatedEntity = dao.merge(yourObjectFromTheHttpSession); 

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

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

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

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

0

Я согласен с Rakesh. , если вы все еще сомневаетесь в его прерве, вы можете установить «show_sql = true» (спящий режим), вы увидите строку sql.

Смежные вопросы