Как я могу обновить объект / объект, который не полностью заполнен? - PullRequest
2 голосов
/ 19 января 2012

У меня есть объект с несколькими полями, но в одном представлении я хочу редактировать только одно из полей.например ... У меня есть пользовательский объект, пользователь имеет идентификатор, имя, адрес, имя пользователя, pwd и так далее.на одном из представлений я хочу иметь возможность изменить pwd (и только pwd).поэтому представление знает только идентификатор и отправляет pwd.Я хочу обновить свою сущность, не загружая остальные поля (их намного больше) и меняя одно поле pwd, а затем сохраняя их ВСЕ обратно в базу данных.кто-нибудь пробовал это.или знаю, где я могу посмотреть.вся помощь приветствуется.

Спасибо заранее.

PS Я должен был дать более подробную информацию.я использую hibernate, roo создает мои сущности.Я согласен, что у каждого представления должна быть своя сущность, проблема в том, что я строю только контроллеры, все было сделано раньше.мы были искателями из уровня обслуживания, но мы хотели использовать некоторые другие искатели, они, казалось, были недоступны через уровень обслуживания, было принято решение убрать уровень обслуживания и просто взаимодействовать с сущностями напрямую (через средства поиска)UserService.update(user) больше не вариант.я недавно нашел User.persist() и User.merge(), объединяет ли обновление все поля объекта или только те, которые не равны NULL, или если я хочу, чтобы одно из них теперь было NULL, как бы оно узнало разницу?1008 *

Ответы [ 3 ]

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

Какие технологии, кроме Spring, вы используете?

Прежде всего, для каждого представления есть отдельные DTO, которые разбираются только на то, что нужно.Один DTO для id + пароль, другой для адресных данных и т. Д. Помните, что DTO могут наследовать друг от друга, поэтому вы можете избежать дублирования.И никогда не передавайте бизнес / ORM объекты непосредственно для просмотра.Это слишком рискованно, утечки в некоторых средах могут позволить пользователям изменять поля, которые вы не предназначали.

После того, как DTO возвращается из представления (большинство веб-сред работают так), просто загрузите всю сущность изаполните только те поля, которые присутствуют в DTO.

Но кажется, что настойчивость беспокоит вас.Предполагая, что вы используете Hibernate, вы можете воспользоваться установкой dynamic-update:

dynamic-update (необязательно - по умолчанию false): указывает, что UPDATE SQL должен генерироваться привремя выполнения и может содержать только те столбцы, значения которых изменились.

В этом случае вы все еще загружаете весь объект в память, но Hibernate сгенерирует как можно меньшее UPDATE, включая только измененные ( грязные ) поля.

Другой подход состоит в том, чтобы иметь отдельные сущности для каждого варианта использования / представления.Таким образом, у вас будет сущность только с идентификатором и паролем, сущность только с адресными данными и т. Д. Все они отображаются в одну и ту же таблицу, но в другое подмножество столбцов.Это легко становится беспорядком и должно рассматриваться как последнее средство.

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

Некоторые провайдеры JPA, такие как EclipseLink, поддерживают группы извлечения.Таким образом, вы можете загрузить частичный экземпляр и обновить его.

Смотрите, http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup

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

См. Ссылку на спящий режим здесь

Для сохранения ()


persist() makes a transient instance persistent. However, it does not guarantee that the 
identifier value will be assigned to the persistent instance immediately, the assignment 
might happen at flush time. persist() also guarantees that it will not execute an INSERT
statement if it is called outside of transaction boundaries. This is useful in long-running 
conversations with an extended Session/persistence context.

Для слияния

if there is a persistent instance with the same identifier currently associated with the session, copy the state of the given object onto the persistent instance

if there is no persistent instance currently associated with the session, try to load it from the database, or create a new persistent instance

the persistent instance is returned

the given instance does not become associated with the session, it remains detached

persist () и merge () не имеют ничего общего с тем, что столбцы изменены или нет. Используйте динамическое обновление, так как @Tomasz Nurkiewicz предлагает сохранять только измененные столбцы. Используйте динамическую вставку для вставки не нуль столбцы.

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