我有一个使用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)),但是这样做时出现“找不到外键”的问题,因此似乎不起作用。
答案 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);
}
}