2016-07-12 6 views
0

Hibernateの永続エンティティのコンテキストでは、LazyInitializationException,... no session or session was closedを取得したときに開発者に手がかりを与えたいと思います。LazyInitializationExceptionをキャッチしてIllegalStateExceptionをスローすると、それは良い考えですか?

私は遅延ロードフィールドゲッターでそれをキャッチについて考え、その後、新しいメッセージではIllegalStateExceptionをスローしました:

@OneToMany(mappedBy = "whatever", fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.PERSIST }) 
@JoinColumn(name = "USER_ID") 
private List<User> userList = new ArrayList<User>(); 

public List<User> getUserList() { 
    try { 
     List<User> userList = this.userList; 
     return userList ; 
    } catch (LazyInitializationException e) { 
     throw new IllegalStateException("Here I explain everything", e); 
    } 
} 

はIllegalStateExceptionがに完璧にフィット思わ:

シグナルことメソッドが不正または不適切な時刻に呼び出されました 時刻。言い換えれば、Java環境またはJavaアプリケーションは、要求された操作に対して適切な状態の ではありません。

(出典:https://docs.oracle.com/javase/7/docs/api/java/lang/IllegalStateException.html

しかし、漁獲量に達していない、あなたはなぜ見ることができますか?ところで、これは良いアイデアですか?

答えて

2

ゲッターでは、標準ゲッターよりもリスト上で多くのことをしないので、キャッチに達しません。

return this.userList; 

同じコード、同じ動作:

List<User> userList = this.userList; 
return userList ; 

は厳密に等価です。

LazyInitExceptionのスタックを見ると、ゲッターがスタックトレースではないことがわかります。したがって、キャッチが期待通りに機能しません。

例外が発生するのは、リストを呼び出すときと同じように、「size()」または「iterator()」を呼び出したときです。

ゲッターにsize()コールを追加してください。

アドバイスをしますか?第

  1. LazyInitExceptionのスタックトレースはすでにロードされていないフィールドあなたを与える:ちょうどそれを投げるのコレクションを見て、どの分野から、それはから来ています。
  2. あなたは(私はあなたがゲッターを呼び出した場合、あなたはその結果を使用したいと思うことに同意しますが、それでも、ゲッターでこの無関係なメソッド呼び出し(size())はコードのにおい
+0

であるあなたがた遅延ロードを失います.size()は例外を発生させます。そして、私はそのトリックの醜さが利益の価値がないかもしれないことに同意します。Merci beaucoup。 – Julien

関連する問題