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);
}
}
我有一个使用 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);
}
}