Spring Jpa实体-EntityManager.getReference

时间:2019-03-16 01:24:36

标签: spring hibernate spring-boot spring-data-jpa spring-boot-jpa

我有一个使用Spring JPA的Spring Boot应用程序,而我想做的是通过仅提供那些子实体的ID来保存具有一些外键的新实体。因此,就像:

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

使用此功能,我希望能够通过仅提供Pet的向导使实现CrudRepository的PersonRepository保存一个Person。使用休眠模式,我可以使用EntityManager.getReference做到这一点。我知道我可以将EntityManager注入我的Entity或Repository中并以这种方式进行操作,但是有没有更简单的方法?我尝试只做person.setPet(new Pet(myPetsGuid)),但是这样做时出现“找不到外键”的问题,因此似乎不起作用。

1 个答案:

答案 0 :(得分:1)

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

@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);
    }

}