Как обрабатывать обновление на основе нескольких столбцов для весенней загрузки

#java #spring-boot #spring-data-jpa

Вопрос:

У меня есть следующая сущность для весенней загрузки

 import org.springframework.data.domain.Persistable
@Entity
@Table
public class AccessContact implements Persistable{
    
    @Id
    @Column(name="ac_id")
    long id;

    @ManyToOne(cascade=CascadeType.MERGE)
    @JoinColumn(name="contact_id")
    Contact contact;

    long reqId;

    @ManyToOne(cascade=CascadeType.MERGE)
    @JoinColumn(name="role_id")
    Role role;

    @CreatedDate
    LocalDateTime createDate;

}
 

Я хочу выполнить операцию обновления, если я получу то же role_id самое, contact_id , я вижу , что есть UniqueContraints , но я думаю, что это приведет к ошибке, если я получу то же role_id самое, contact_id , может кто-нибудь, пожалуйста, дайте мне знать, как я могу это сделать?

Редактировать 1: Я вижу, что из документа репозитория spring новый метод, который в основном решает, является ли сущность новой или нет, ниже приведен мой обновленный пример

 @Entity
@Table
public class AccessContact{
    AccessRepository accessRepo
    @Id
    @Column(name="ac_id")
    long id;

    @ManyToOne(cascade=CascadeType.MERGE)
    @JoinColumn(name="contact_id")
    Contact contact;

    long reqId;

    @ManyToOne(cascade=CascadeType.MERGE)
    @JoinColumn(name="role_id")
    Role role;

    @CreatedDate
    LocalDateTime createDate;

   @Transient
   public boolean isNew(){
     AccessContact accessContact = accessRepo.findContactByContactAnsRole(contact, role);}
     if(accessContact == null)
       return true;

     return false;
   }
}
 

мое средство доступа выглядит так

 @Repository
public interface AccessRepository extends JpaRepository<AccessContact, Long>{
  public AccessContact findContactByContactAnsRole(Contact c, Role r);
}
 

но я не знаю, правильный ли это способ сделать это?

Комментарии:

1. есть ли какие-либо проблемы с jparepository.save()?

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

3. Что вы имеете в виду, говоря, что хотите выполнить обновление «если я получу тот же идентификатор роли, идентификатор контакта»? Сущности JPA являются управляемыми сущностями , поэтому любое изменение сущности (пока она управляется, а не отделена) будет передано в базу данных. Или вы хотите сказать, что получаете обособленный объект или DTO, например, какой-то JSON, и хотите выполнить вставку ИЛИ обновление ?

4. Кроме того, это НЕ очень хорошая реализация isNew . Проверьте: thorben-janssen.com/spring-data-jpa-state-detection (Я не уверен, зачем вам это вообще нужно)

5. @BenjaminMaurer : все, что вы сказали, верно, из-за повторения я не добавил свой объект DTO, но да, я его получаю, и я хочу выполнить вставку или обновление на основе этого

Ответ №1:

@BenjaminMaurer имеет право, вам нужно получить запись из базы данных, если она не найдена, сохраните свою запись, а если найдена, то поместите значения из вашей записи в запись из базы данных и сохраните. В этом случае jparepository.save() все будет работать так, как вы и ожидали.

Запись из БД управляется, например, Hibernate, и ваша запись может быть не такой. Вот почему вам нужно сделать это таким образом и почему jparepository.save() все получилось не так, как вы ожидали.

Может быть, подумайте о получении записи из бд при сопоставлении (с помощью AccessRepository) вместо использования new AccessContact()