首页 > 解决方案 > Spring Jpa 实体 - EntityManager.getReference

问题描述

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

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

使用它,我希望能够让实现 CrudRepository 的 PersonRepository 仅通过提供 Pet 的 guid 来保存一个人。使用直接休眠我可以使用 EntityManager.getReference 来做到这一点。我知道我可以将 EntityManager 注入到我的 Entity 或 Repository 中并以这种方式执行某些操作,但是有更简单的方法吗?我尝试只做 person.setPet(new Pet(myPetsGuid)),但是这样做时我得到一个“找不到外键”,所以这似乎不起作用。

标签: springhibernatespring-bootspring-data-jpaspring-boot-jpa

解决方案


首先,您应该向属性添加@ManyToOne关系pet

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

    //...

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

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

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

}

推荐阅读