Java - объединение компонентов / объектов Hibernate - перед сохранениемOrUpdate - PullRequest
1 голос
/ 20 апреля 2011


Каков наилучший способ объединить 2 спящих объекта перед saveOrUpdate.
Я получаю один объект от пользователя (отправленную форму) и хочу сохранить его с помощью saveOrUpdate.
Hibernate установит все поля пустыми, если они не существуют в пользовательском компоненте (пользователь может обновить только некоторые данные).
Вот как я хочу, чтобы это выглядело так:

//this is the data the submitted from the user form.
PersonEntity entityFromTheClient = getPersonEntityFromClient();

//this is the data that i pull from the db for the merge
PersonEntity entityFromDb = getPersonEntityFromDb(entityFromTheClient.getID()); //entityFromTheClient.getID() = PK

//this is the method that i need to merge entityFromTheClient into entityFromDb
PersonEntity dataMerged = (PersonEntity)SomeUtill.merge(entityFromTheClient,entityFromDb);

//this will save the merged data.
session.saveOrUpdate(dataMerged);

Также обратите внимание, что Person может содержать членов других сущностей @OneToMany @ManyToMany и @ ManyToOne

Как вы уже поняли, эта ситуация только для обновления. вставить будет другая история.

Спасибо

1 Ответ

1 голос
/ 20 апреля 2011

Создание третьего объекта для saveOrUpdate кажется странным, когда у вас уже есть управляемая сущность прямо из базы данных для работы с ней. Просто скопируйте поля, которые пользователь может изменить прямо на управляемый объект, и зафиксируйте вашу транзакцию. На самом деле нет даже необходимости использовать saveOrUpdate явно, если вы не делаете что-то странное с границами транзакции в вашем методе getFromDB.

Transaction tx = session.beginTransaction();

PersonEntity entityFromTheClient = getPersonEntityFromClient();

//this is the data that i pull from the db for the merge
PersonEntity entityFromDb = getPersonEntityFromDb(entityFromTheClient.getID()); 

entityFromDb.setA(entityFromTheClient.getA());
entityFromDb.setB(entityFromTheClient.getB());

tx.commit();

Фактическая обработка транзакций, конечно, зависит от настроек вашей структуры.

Вот и все, готово. Если вы хотите скрыть настройки внутри какой-то утилиты, это нормально. Не вижу причин, чтобы сделать его более сложным, чем на основании предоставленной вами информации.

...