2016-11-02 8 views
0
Map<String, Type> myMap = new HashMap<String, Type>(); 

Query query = session.createQuery("" + 
     "SELECT a " + 
     "FROM Articulo a "); 
List<Object> list = query.list(); 

// Add all query elements to the hashmap 
for (Object entrada : lista) { 
    myMap.put(entrada.getKey(), (Type) entrada); 
// Type someOtherObject = entrada.getReferencedProperty(); 
} 

Type someObject = (Type) myMap.get("someValidKey").getReferencedProperty(); //normal getter 

ここでsomeObjectnullとなり、オブジェクトが外されています。しかし、もし私がsomeOtherObject行のコメントを外したら。関係が正しく取得されます。Hibernateなぜ私のオブジェクトは切り離されていますか?

何が起こっていますか?

+1

これらは同じ方法で、実際にはありますか?その区別は非常に重要です。 'codLineas'はあなたが投稿したコードのどこにも定義されていないので、私は推測していません。 – rmlan

+0

@rmlanは申し訳ありませんが、私はコードを簡素化していたと私はそれを逃しました。私は今それを編集しました。コードはすべて同じメソッドの一部です。 – harogaston

答えて

1

私は問題を発見しました。私のコードでは深く、私はsession.clear()を呼び出しました。それが原因で、すべてのエンティティが切り離されていました。

+0

で – Kuba

1

コード全体が表示されていませんが、の場合、トランザクションコンテキストを終了する(またはトランザクションが最初にない)ため、オブジェクトが切り離されるケースが95%です。 related answerから

は、できるだけ早くセッションは、負荷を保存し得るかを見つけるために使用されるようなエンティティは、エンティティが外れてしまう、閉じられています。これはセッションにもはや接続されておらず、他のPOJOと同じように機能することを意味します。

+0

私はセッションを明示的に閉じていません。自動的に閉じられる理由はありますか? – harogaston

+0

それともトランザクション内にあるが、 'ReferenceProperty'は複雑なオブジェクトであり、デフォルトで初期化することはできません。 'fetch-type EAGER/LAZY'を参照してください。ところで 'entrada.getReferencedPropertyは();'ループ内の他のクエリを作ることができるので、あなたは、オブジェクトが接続されていることを参照してください。 –

+0

'@ Transactional'を使用していますか?あなたをさらに助けるために、より多くのコードを表示する必要があります。使用 –

関連する問題