我在更新在@OneToMany关系中作为集合的一部分创建的对象时遇到问题。
假设我有一个非常简单的领域模型,包括房屋和住在这些房子里的人:
行:
@Entity
public class House {
@Id
@GeneratedValue
private Long id;
@OneToMany(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Person> persons;
public void addPerson(Person p) {
persons.add(p);
public Set<Person> getPersons() {
return persons;
}
}
人:
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private House house;
}
我有一个用于House的Spring Boot JPA存储库,以及一个带有该方法的HouseService:
@Transactional
public Person addPerson(Long houseId) {
House house = houseRepository.findOne(houseId);
Person person = new Person();
house.addPerson(person);
houseRepository.save(house);
return person;
}
调用上面的方法会创建一个新的Person并将该人员持久存储在数据库中,但返回的Person实例没有ID集(即addPerson()。getId()返回null)。我是否可以获取服务以返回具有持久版本ID的人员实例?
我想对使用服务的addPerson()方法创建的Person进行更改,并能够在稍后阶段保留这些更改。
答案 0 :(得分:1)
如果你想获得Person的id,你可以创建PersonRepository。就像这个questshion。
person = personRepository.save(person);
personRepository.flush();
id=person.getId();
如果你想在持久之前获得人物ID,那么你必须生成id并手动设置它。
答案 1 :(得分:0)
在任何ORM框架中,db中实体的持久性由ORM控制意味着无法保证您调用houseRepository.save(house)
的实体将立即保存在数据库中,以防您想要这样的行为必须强制你的JPA在事务范围内立即刷新实体。
为此,您需要修改houseRepository.save
方法,以便在调用entityManager.persist()
后添加以下逻辑
尝试在那里添加以下代码
entityManager.flush();
我相信Spring启动JPA有助于刷新操作,在这种情况下你可以直接调用它
持续通话后houseRepository.flush()
。