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

时间:2016-09-29 00:22:45

标签: java nhibernate spring-data persistence spring-data-jpa

我在更新在@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进行更改,并能够在稍后阶段保留这些更改。

2 个答案:

答案 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()