2016-09-29 34 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

相關問題