Spring Jpa 实体 - EntityManager.getReference

Spring Jpa Entity - EntityManager.getReference

我有一个使用 Spring JPA 的 Spring 引导应用程序,我想做的是通过提供这些子项的 ID 来保存一个具有一些外键的新实体实体。所以,比如:

@Table(name = "PERSON")
public class Person {
@Column(name = "PET_GUID")
public Pet pet;
}

使用它,我希望能够让我的 PersonRepository 实现 CrudRepository,只需提供 Pet 的 guid 即可保存一个 Person。使用直接休眠我可以使用 EntityManager.getReference 来做到这一点。我知道我可以将 EntityManager 注入到我的实体或存储库中并以​​这种方式做一些事情,但是有没有更简单的方法?我尝试只做 person.setPet(new Pet(myPetsGuid)),但我在这样做时得到了 "foreign key not found",所以这似乎不起作用。

首先,您应该将 @ManyToOne 关系添加到 pet 属性:

@Entity
@Table(name = "PERSON")
public class Person {

    //...

    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "pet_guid")
    privat Pet pet;
}

它告诉 Hibernate 使用 Pet 实体(及其 table)的外键。

其次,您应该使用 PersonRepository 的方法 getOne 来获取对 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);
    }

}