2016-10-26 13 views
2
@Entity 
public class Post { 

private Set<Comment> comments = new LinkedHashSet<Comment>(); 

@OneToMany(mappedBy = "businessunit", fetch = FetchType.LAZY, cascade = { CascadeType.ALL }, orphanRemoval = true) 
public Set<Comment> getComments() { 
    return comments; 
} 
} 

@Entity 
public class Comment { 

private Post Post; 
private BUnit bUnit; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "POST_ID", referencedColumnName = "ID") 
public Post getPost() { 
    return post; 
} 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "BU_ID", referencedColumnName = "ID") 
public BUnit getBUnit() { 
    return bUnit; 
} 
} 

私は子のセットを含む親クラスを持っています。私は親に保存するときに、私はコメントを追加するように追加操作が正常に動作し、子供も保存されます。JPA 1対多の更新が失敗します

更新操作では、既存のコメントと新しいコメントがあります。私は既存のコメントのmodified_byフィールドを更新し、新しいコメントは希望のフィールドを設定します。次に、すべてのコメント(新しいものと既存のもの)を追加して、すべての削除 - 孤立したエラーを取得しないようにします。

post.getComments().clear(); 
post.getComments().addAll(newComments); 
dao.update(post); 

更新は例外org.hibernate.LazyInitializationExceptionをスロー:怠惰な役割のコレクションを初期化に失敗しました:

任意のアイデアを子要素には、新規および既存の要素が含まれます、更新のために、この問題を解決する方法。

ありがとうございました。

答えて

0

まず、mappedBy = "businessunit"は、反対側のプロパティ名(この場合はpost)を参照する必要があります。

まだ例外が表示されている場合は、hereと表示されます。 (この例外には複数の理由があります)

最後に、副次的な点として、明示的にfetch = FetchType.LAZYというラベルを付ける必要はありません。デフォルトであるためです。これを削除して可読性を向上させることができます。

+0

bphilipnycが指摘してくれてありがとう、編集ミスです。 – Tabho

0

解決策が見つかりました。更新はトランザクションの下で実行され、かなりうまく動作しています。トランザクションの外で私はdbモデルの子オブジェクトにアクセスして、uiモデルに変換していました。これが例外の理由でもありました。子要素にアクセスする必要はありませんでしたので、最終的に削除しました。

関連する問題