Как я могу предотвратить вставку и разрешить только обновление моего объекта с помощью spring-boot? - PullRequest
0 голосов
/ 15 марта 2019

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

Я попробовал код следующим образом

 public void update() throws UpdateFailedException{

   boolean b= findByPK(); // checking if the entry is already present.

   if(b){

          repo.save(object); // saving it, internally it will be updating.
   }else{

         throw new UpdateFailedException("Object not present to update");
        }
 } 

Приведенный выше код не будет соответствовать моим требованиям эффективности, так как он несколько раз опрашивает мою БД, и, кроме того, я не могу гарантировать последовательность в его поведении, поскольку его не происходит вта же граница транзакции. (т.е. даже если я получаю, что запись уже существует в БД, существует возможность удаления моей записи из внешней границы перед вызовом сохранения, и в результате мое сохранение сделает вставку, которую я хочупредотвратить)

Каким будет эффективный способ сделать это?Мне также нужно управлять транзакцией для данных пружины JPA.

или Есть ли способ узнать, выполняет ли save() вставку или нет ?(чтобы я мог предотвратить вызов save(), если он собирается сделать вставку)

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Допустим, у вас есть 10 свойств, и пользователь только что изменил одно свойство, поэтому вместо обновления всех 10 свойств вы можете использовать @DynamicUpdate.Это только обновит измененные поля.


Hibernate 4 +

@DynamicInsert(true)
@DynamicUpdate(true)

@Entity
@Table(name = "User")
@org.hibernate.annotations.Entity(dynamicUpdate = true) //may be deprecated
public class User 

@DynamicUpdate используется для указания того, что оператор SQL UPDATE должен быть сгенерирован whenever an entity is modified. Byпо умолчанию Hibernate использует оператор cached UPDATE, который устанавливает все столбцы таблицы.Когда сущность аннотируется аннотацией @DynamicUpdate, PreparedStatement собирается include only столбцы, у которых values было changed.

0 голосов
/ 15 марта 2019

Я предлагаю вам установить Id в 0, когда объект не существует в вашей БД, поэтому если это обновленный объект, он должен иметь Id != 0

public void update() throws UpdateFailedException{


   if(object.getId() != 0){

          repo.save(object); // saving it, internally it will be updating.
   }else{

         throw new UpdateFailedException("Object not present to update");
        }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...