#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()