Сущность Spring Jpa — EntityManager.getReference

У меня есть приложение 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)), но при этом я получаю «внешний ключ не найден», так что, похоже, это не работает.

0
0
251
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, вы должны добавить отношение @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 — это то, чего мне не хватало. Это то, что мне было нужно! Спасибо!

cloudwalker 18.03.2019 01:29

Другие вопросы по теме