Обновление одного поля в сущности JPA - PullRequest
10 голосов
/ 13 августа 2010

У меня есть объект User, которому назначена системная привилегия в функции.У меня есть веб-страница, где вы выбираете пользователя из выпадающего списка и отправляете форму на сервер.На стороне сервера я хочу обновить только одно поле для этой сущности.

Моя сущность «Пользователь» будет иметь значения по умолчанию для всех объектов, кроме одного поля, которое устанавливается, и его идентификатора.Нужно ли делать findById, затем обновлять определенное поле, затем выполнять слияние, или есть способ сказать, чтобы обновить только это поле?

Ответы [ 3 ]

9 голосов
/ 14 августа 2010

Нужно ли выполнять findById, затем обновлять определенное поле, затем выполнять слияние

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

или есть способ указать только обновить это поле?

Нет.Но вы можете использовать «короткую» версию вашего User (только с полями для обновления).Другой вариант - использовать Операция группового обновления , но это действительно не очень хороший вариант использования.Я бы не использовал этот подход.

Ссылка

  • Спецификация JPA 1.0
    • 4.10 Операции массового обновления и удаления
8 голосов
/ 18 сентября 2013

JPA 2.1 теперь поддерживает критерии обновления, которые позволяют вам частично обновить сущность с помощью javax.persistence.criteria.CriteriaUpdate<T>.

Javadoc здесь .

Пример кода:

EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = factory.createEntityManager();

// create user
em.getTransaction().begin();
User user = new User();
user.setUsername("user@example.com");
user.setPassword("password");
user.setCreatedAt(new Date());
em.persist(user);
em.getTransaction().commit();
// end create user

assert user.getId() != 0;

System.out.println("Before update user Date of Birth: " + user.getDateOfBirth());

// update user date of birth
em.getTransaction().begin();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaUpdate<User> updateCriteria = cb.createCriteriaUpdate(User.class);
Root<User> root = updateCriteria.from(User.class);
// update dateOfBirth property
updateCriteria.set(root.get("dateOfBirth"), new Date());
// set where clause
updateCriteria.where(cb.equal(root.get("id"), user.getId()));
// update
int affected = em.createQuery(updateCriteria).executeUpdate();
System.out.println("Affected row: " + affected);
em.getTransaction().commit();
// end update user date of birth


// select user again to verify
em.getTransaction().begin();
em.refresh(user);

System.out.println("After update User Date of Birth: " + user.getDateOfBirth());

em.getTransaction().commit();
em.close();

Подробнее о Частичном обновлении JPA 2.1 здесь .

0 голосов
/ 06 октября 2014

Если вы обновляете объект, выбранный клиентом, у вас есть два варианта.

1) Если выбранный пользователь представлен в клиенте как отдельная сущность, то при получении сущности пользователя в компоненте вашего сервера вам нужно только назначить новое значение поля, а затем выполнить em.merge (selectedUser) ). Это имеет отрицательный эффект, когда состояние пользователя могло измениться между выбором пользователя и вашим сервером, выполняющим обновление, что привело к нежелательным результатам.

2) Просто попросите форму отправить идентификатор пользователя, а затем использовать findById для поиска пользователя, изменения вашей сущности и принятия изменения. Если это управляемый сервером блок персистентности, вам не нужно фиксировать.

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