2016-07-04 6 views
0

私は休止状態のエンティティマネージャ(4.2.16)を使用しています。 新しい子を追加した後、既存のエンティティをマージするときに問題があります。新しく作成した子のIDを取得したいのですが、IDは設定されていません。親を作成するカスケードでエンティティを永続化するときに子のIDを取得する

@Entity 
@Table(name = "PARENT") 
@GenericGenerator(name = "gen_identifier", strategy = "sequence", parameters = { 
    @Parameter(name = "sequence", value = "SQ_PARENT") 
}) 
public class Parent { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen_identifier") 
    private Long id; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "parent") 
    private Set<Child> children; 
} 

@Entity 
@Table(name = "CHILD") 
@GenericGenerator(name = "gen_identifier", strategy = "sequence", parameters = { 
    @Parameter(name = "sequence", value = "SQ_CHILD") 
}) 
public class Child { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen_identifier") 
    private Long id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "PARENT_ID") 
    private Parent parent; 
} 

コード(トランザクション1): はここに私のモデルである

public Long saveParent() { 
    Parent parent = new Parent(); 

    entityManager.persist(parent); 

    System.out.println("saveParent : parent.id = " + parent.getId()); 
    return parent.getId(); 
} 

コードが子を追加する(トランザクション2)

public void addChild(Parent parent) { 
    Child child = new Child(); 
    child.setParent(parent); 
    parent.getChildren().add(child); 

    entityManager.merge(parent); 
    System.out.println("addChild : parent.id = " + parent.getId()); 

    // The following give me a null id 
    System.out.println("addChild : child.id = " + parent.getChildren().iterator().next().getId()); 

    System.out.println("addChild : child.id = " + child.getId()); 
} 

コードを実行 、私は子供のIDがnullでないことを期待するでしょう。マージから返さ

saveParent : parent.id = 1000 
addChild : parent.id = 1000 
addChild : child.id = null 
addChild : child.id = null 

答えて

1

マージは、常にあなたの操作のためのエンティティとしてマージするコールの後に起こるすべての変更を使用する必要があり、新たにintiallizedエンティティを返すのみエンティティに反映されています。ここで私は取得が出力されます。このメソッドを呼び出す任意のコードではなく、新たに生成された親を使用する必要がありますように、あなたはまた、このメソッドから親を返す必要があります

public Parent addChild(Parent parent) { 
Child child = new Child(); 
child.setParent(parent); 
parent.getChildren().add(child); 

parent=entityManager.merge(parent); 
System.out.println("addChild : parent.id = " + parent.getId()); 

// The following give me a null id 
System.out.println("addChild : child.id = " + parent.getChildren().iterator().next().getId()); 

System.out.println("addChild : child.id = " + child.getId());' 
return parent; 

}

以下のようにあなたの問題を解決するために、あなたのコードを変更する必要がありますその後、それに併合して変更を加えていない古いものです。

(マージについての詳細を読むために)下のリンク

http://blog.xebia.com/jpa-implementation-patterns-saving-detached-entities/

をご覧ください。
関連する問題