spring - 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)),但是这样做时我得到一个“找不到外键”,所以这似乎不起作用。
解决方案
首先,您应该向属性添加@ManyToOne关系pet
:
@Entity
@Table(name = "PERSON")
public class Person {
//...
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "pet_guid")
privat Pet pet;
}
Pet
它告诉 Hibernate 使用实体(及其表)的外键。
其次,您应该使用您的方法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);
}
}
推荐阅读
- python - 饼图彩色文本 matplotlib
- reactjs - SignalR/NetCore3.1/React.Js ~/negotiate?negotiateVersion=1 404 (Not Found) (相信它的 CORS 问题)
- elasticsearch - elasticsearch理解线程池
- ios - iOS:创建许多 IBOutlets 有性能开销吗?
- python - pyopencl 输出的值错误
- javascript - 强制更改字符串遵守 Typescript 类型联合
- c++ - 如何调试“ISO C++ 禁止指针和整数之间的比较”
- oracle - 如何在 PostgreSQL 中为用户创建同义词
- python - Discord bot 无法使用线程,卡住错误:必需的位置参数:'ctx'
- openstack - 在 Openstack 中使用 Heat 配置网络 MTU