私は休止状態のエンティティマネージャ(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