У меня есть приложение Spring Boot с использованием Spring JPA, и я пытаюсь сохранить новый объект с некоторыми внешними ключами, просто указав идентификаторы этих дочерних объектов. Итак, например:
@Table(name = "PERSON")
public class Person {
@Column(name = "PET_GUID")
public Pet pet;
}
Используя это, я хотел бы, чтобы мой PersonRepository, реализующий CrudRepository, сохранил человека, просто предоставив руководство для питомца. Используя прямой спящий режим, я могу сделать это с помощью EntityManager.getReference. Я знаю, что могу внедрить EntityManager в свою сущность или репозиторий и сделать что-то таким образом, но есть ли более простой способ? Я пытался просто сделать person.setPet(new Pet(myPetsGuid)), но при этом я получаю «внешний ключ не найден», так что, похоже, это не работает.
Во-первых, вы должны добавить отношение @ManyToOne к свойству pet:
@Entity
@Table(name = "PERSON")
public class Person {
//...
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "pet_guid")
privat Pet pet;
}
Он говорит Hibernate использовать внешний ключ для объекта Pet (и его таблицы).
Во-вторых, вы должны использовать метод getOne вашего PersonRepository, чтобы получить ссылку на сущность Pet, например:
@Service
public class PersonService {
private final PetRepository petRepo;
private final PersonRepository personRepo;
//...
@NonNull
@Transactional
public Person create(@NonNull final PersonDto personDto) {
Person person = new Person();
//...
UUID petId = personDto.getPetId();
Pet pet = petRepo.getOne(perId);
person.setPet(pet);
//...
return person.save(person);
}
}
Ах да, вызов getOne — это то, чего мне не хватало. Это то, что мне было нужно! Спасибо!