更新作为@OneToMany 关系的一部分创建的项目

Updating item created as part of @OneToMany relationship

我在更新作为@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;

}

我有一个 Spring 用于 House 的 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 并将该人保存在数据库中,但是 returned Person 实例没有 ID 集(即 addPerson().getId() returns 为空)。我可以将服务提供给 return 具有持久版本 ID 的个人实例吗?

我想对使用服务的 addPerson() 方法创建的 Person 进行更改,并能够在稍后阶段保留这些更改。

在任何 ORM 框架中,实体在数据库中的持久性由 ORM 控制,这意味着无法保证您调用 houseRepository.save(house) 的实体将立即持久化在数据库中,以防您希望这样您必须强制 JPA 在事务范围内立即刷新实体的行为。

为此,您需要修改 houseRepository.save 方法,在它调用 entityManager.persist()

后添加以下逻辑

尝试在此处添加以下代码

entityManager.flush();

相信Spring boot JPA里面有flush操作方便,这样的话可以直接调用 houseRepository.flush() 在你坚持调用之后。

如果你想获取 Person 的 id,你可以创建 PersonRepository。像这样 questshion.

person = personRepository.save(person);
personRepository.flush();
id=person.getId();

如果要在persist之前获取person Id,那么必须生成id并手动设置。