2010-11-25 11 views
3

私はマージにいくつか問題があります。私の更新方法は、このように動作します:[Hibernate]トランジエントオブジェクトを子オブジェクトとマージする

void update(Parent parent) { 
    evict(parent); 
    merge(parent); 
} 

私のクラス:

Parent { 

    Long id; 

    List<Children> childrens; 

    @OneToMany(targetEntity =ChildrenImpl.class, fetch=FetchType.LAZY) 
    @JoinColumn(name="PARENT") 
    @org.hibernate.annotations.Cascade(value = org.hibernate.annotations.CascadeType.ALL) 
    List<Children> getChildrens(){...} 

    @Id 
    Long getId() {...} 

} 



Children{ 

    Parent parent; 

    @ManyToOne(targetEntity = ParentImpl.class, fetch = FetchType.LAZY) 
    @org.hibernate.annotations.Cascade(value = org.hibernate.annotations.CascadeType.ALL) 
    @JoinColumn(name = "PARENT", nullable = false) 
    Parent getParent(){...} 

} 

私は新しい親(トランジェント)オブジェクトを作成し、新しい子供を追加して更新しようとは(&マージを立ち退かせる)、その後ショーをログに記録します私はこれをフラッシュ休止セッションの後に:

INSERT PARENT //everythings here is ok. 

INSERT CHILDREN // but without parent id(id=null) 

順序は良いですが、子供は挿入に親のIDを持っていません。 Parentがデータベースに永続化されている場合、すべて正常に動作し、子どもは常に良いIDを持ちます。

私は一時オブジェクトからIDを取得するにはどうすればよいですか(永続化からOKです)。

よろしくお願いいたします。 KZ。

+0

session.saveOrUpdate()で一時的なインスタンスを保存して、IDがエンティティにアタッチされるようにしましたか?子オブジェクトの挿入が実行されたときにエンティティにIDがあることをデバッガでチェックしましたか? – fasseg

答えて

2

一時オブジェクトからIDを取得することはできません。定義によって、一時オブジェクトにはIDがありません。

新しいオブジェクトを作成すると、なぜマージしますか?新しいオブジェクトを作成するときは、オブジェクトを保存する必要があります。既存のオブジェクトの値を変更する場合は、それを更新する必要があります。マージする必要があるのは、永続化されたオブジェクトがデタッチされ、そのオブジェクトを再アタッチする必要がある場合だけです。

+0

非常に複雑なオブジェクトグラフの場合をとります。それをXMLにエクスポートし、変更を加えてからインポートします。既存の永続オブジェクトを取得して古いものとそのカスケードと比較する必要がある場合は、維持するのが非常に困難で困難です依存関係を更新して更新します。代わりに、新しいものを使って一時オブジェクトを作成し、新しいものと古いものを比較し、新しい一時オブジェクトにIDを追加してマージして保存するといいでしょう。これは私がやりたいことですが、それは不可能だと言っていますか? – eipark

+0

新しいオブジェクトとnotNull IDを分離オブジェクトと区別する方法は?私が推測する方法はありません。ですから、set idを持つ新しいオブジェクトを持つマージを行うのは大丈夫です。エンティティが不変の場合、このロジックを持つかもしれません。新しいオブジェクトを作成する必要があります。 – ses