2016-09-29 3 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ブートJPAリポジトリをHouseに、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はデータベースに保持されますが、返された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フレームワークでは、db内のエンティティの永続性はORMによって管理されるため、houseRepository.save(house)を呼び出したエンティティがすぐにデータベースに保持されるという保証はありません。 JPAを使用して、トランザクションスコープ内ですぐにエンティティをフラッシュします。このため

あなたはそれがそこに以下のコード

entityManager.flush(); 

私は春のブートJPAはそれにフラッシュ操作を容易に信じるの追加entityManager.persist()

てみてくださいを呼び出した後、以下のロジックを追加するために、あなたのhouseRepository.save方法を変更していますその場合は、永続的な呼び出しの後に直接 houseRepository.flush()と呼ぶことができます。

+0

は保存されずに保存されますが、違いはわかりません。ありがとう。 – Tokazio

関連する問題