обновление поля объекта в спящем режиме - PullRequest
8 голосов
/ 22 июля 2011

У меня есть object A, который отображается на table A в БД

class A {
     Integer id;
     String field2,field2;field3 ,... fieldN;
     //lots of other attribute
}

Теперь я хочу написать API-интерфейс DAO, который просто обновляет отдельное поле. Один из подходов состоит в том, что я могу сначала загрузить объект, затем изменить нужный мне атрибут и затем использовать merge api

//start transcation
A a = session.load(A.class, id);
A.setfieldP(newValue)
session.merge(A)
//commit transcation

Теперь, если я использую следующий код

 //start transcation
 A a = new A();
 a.setId(id); //set a id by which object A exists in DB
 A.setfieldP(newValue)
 session.merge(A)
 //commit transaction

Теперь при втором подходе все поля, кроме id и fieldP, устанавливаются в нуль

1) Есть ли другой подход?
2) Могу ли я использовать обновление вместо слияния?

Ответы [ 4 ]

13 голосов
/ 22 июля 2011

Если вам нужно обновить сразу несколько сущностей, наиболее эффективным способом является использование запроса:

Query query = session.createQuery("update EntityName set fieldP = 'newValue' "
        + "where id IN (75, 76)");
query.executeUpdate();

Это позволяет изменять значения полей без загрузки сущности или сущностей в память.

Рекомендуется использовать именованные запросы и именованные параметры - приведенная выше реализация является лишь примером.

2 голосов
/ 18 декабря 2016

Используя JPA, вы можете сделать это следующим образом.

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaUpdate<User> criteria = builder.createCriteriaUpdate(User.class);
Root<User> root = criteria.from(User.class);
criteria.set(root.get("fname"), user.getName());
criteria.set(root.get("lname"), user.getlastName());
criteria.where(builder.equal(root.get("id"), user.getId()));
session.createQuery(criteria).executeUpdate();
2 голосов
/ 22 июля 2011

Я обычно предпочитаю session.get вместо session.load, так как session.get будет возвращать ноль , а не генерировать исключение, но это зависит от поведения, которое вы хотите.

загрузка объекта, установка поля и вызов либо

 session.merge(myObject)

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

 session.saveOrUpdate(myObject)

до тех пор, пока объект не был отсоединен, что в вашем случае не будет отсоединено. Вот хорошая статья , объясняющая различия в слиянии и saveOrUpdate.

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

1 голос
/ 22 июля 2011

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

...