2014-12-16 6 views
1

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

Мой метод обновления выглядит следующим образом:

@Transactional 
    public void updateEntity(String a, String b, boolean c, Date d) { //some more params 
     MyEntity entity = dao.findEntityBy(a, b, c); //might be some more params 
     //nullcheck 

     if (!entity.getA().equals(a)) { 
      entity.setA(a); 
     } 
     if (!entity.getB().equals(b)) { 
      entity.setB(b); 
     } 
     //repeat per property... a-n 

     dao.save(entity); 
    } 

Вопрос: Должен ли я проверять каждый признак объекта, если оно изменилось, а затем использовать только сеттер? Или я просто пропущу чеки и просто переопределяю объект?

MyEntity entity = dao.findEntityBy(a, b, c); 
entity.setA(a); 
entity.setB(b); 
//... 
dao.save(entity); 

Что такое perfered way? Каковы преимущества (преимущества) любого решения?

ответ

2

Практически во всех «готовой продукции» программного обеспечения вы можете увидеть второй версии

MyEntity entity = dao.findEntityBy(a, b, c); 
entity.setA(a); 
entity.setB(b); 
//... 
dao.save(entity); 

Честно говоря, я не вижу добавленной стоимости в первом варианте (но добавил обслуживание и ниже читаемость можно увидеть).

3

Если у вас есть много атрибутов, вы можете использовать dynamic-update=true для оптимизации производительности. Атрибут dynamic-update сообщает Hibernate, следует ли включать немодифицированные свойства в оператор SQL UPDATE.

Он может быть сконфигурирован как

@Entity 
@Table(name = "MY_ENTITY") 
@org.hibernate.annotations.Entity(
     dynamicUpdate = true 
) 
public class MyEntity { 
} 
+0

У меня также есть установить 'selectBeforeUpdate = true'? Или это вызовет дополнительный выбор и не понадобится, потому что я уже выбрал объект в '@ Transactional'? – membersound

+0

И вы считаете, что преимущество '@ DynamicUpdate' настолько велико, что тот факт, что hibernate должен регенерировать каждый SQL-запрос динамически, можно пренебречь? Мы говорим об объектных записях с длиной строки около 200 символов, где часто, например, нужно обновлять только один ряд строк (например, наличие запаса). – membersound

+0

О selectBeforeUpdate = true, я не думаю, что вы должны его использовать, но было бы хорошо видеть, что происходит практически, если вы его укажете. О динамическом обновлении номера столбцов не имеют значения столбца. –