2016-09-29 117 views
1

我在更新作为@OneToMany关系中的一部分集创建的对象时遇到问题。更新作为@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的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

也许你应该有一个双向关系房子可以有人但没有人住宅 – Tokazio

+0

对不起我把它留在了代码之外 - 有一个双向的关系,我已经更新了这个问题。谢谢。 – bobsyouruncle

+0

与级联吗? – Tokazio

回答

1

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

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

如果你想在持久化之前获得人员ID,那么你必须生成ID并手动设置它。

0

在任何ORM框架中,数据库中实体的持久性由ORM控制,意味着不保证您要求houseRepository.save(house)的实体将立即保留在数据库中,以防万一您希望此类行为必须强制您的JPA在事务范围内立即刷新实体。

为此,您已经修改houseRepository.save方法添加下面的逻辑,它调用entityManager.persist()

尝试添加下面的代码有

entityManager.flush(); 

我相信春天开机JPA利于它刷新操作后,在这种情况下,您可以直接在持续通话后将其称为 houseRepository.flush()

+0

看到保存而不是坚持,但不知道区别。谢谢。 – Tokazio

相关问题