【问题标题】:Updating item created as part of @OneToMany relationship更新作为@OneToMany 关系的一部分创建的项目
【发布时间】:2017-02-07 03:26:30
【问题描述】:

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

【问题讨论】:

  • 也许你应该有一个双向关系房子可以有人但人没有房子
  • 抱歉,我把它从代码中遗漏了——存在双向关系,我已经更新了问题以显示这一点。谢谢。
  • 也有级联?
  • 是的,级联 = CascadeType.ALL
  • mappedBy="house" 添加到您的@OneToMany。我也将@JoinColumn(name = "ID_HOUSE") 定义为@ManyToOne 一侧。

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


【解决方案1】:

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

为此,您将修改您的 houseRepository.save 方法以在调用 entityManager.persist() 后添加以下逻辑

尝试在此处添加以下代码

entityManager.flush();

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

【讨论】:

  • 见过保存而不是持久化,但不知道区别。谢谢。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2021-08-27
    • 2022-01-07
    • 2013-11-09
    • 2021-02-20
    相关资源
    最近更新 更多