2017-08-09 9 views
0

時々、私はこの警告メッセージが表示されます。休止状態警告(HHH000470)の修正方法は?

 
aug 09, 2017 3:40:02 AM org.hibernate.collection.internal.AbstractPersistentCollection setCurrentSession 
WARN: HHH000470: An unexpected session is defined for a collection, but the collection is not connected to that session. A persistent collection may only be associated with one session at a time. Overwriting session. Collection : [royaleserver.database.entity.PlayerEntity.homeChests#1757] 

PlayerEntity:

public class PlayerEntity implements Identifiable<Long>, Serializable { 
    ... 
    @OneToMany(mappedBy = "player") 
    private Set<HomeChestEntity> homeChests = new HashSet<>(); 

    public Set<HomeChestEntity> getHomeChests() { 
     return homeChests; 
    } 

    public PlayerEntity setHomeChests(Set<HomeChestEntity> homeChests) { 
     this.homeChests = homeChests; 
     return this; 
    } 
} 

HomeChestEntity:

public class HomeChestEntity implements Serializable { 
    @Id 
    @ManyToOne 
    @PrimaryKeyJoinColumn(name = "player_id", referencedColumnName = "id") 
    private PlayerEntity player; 
    ... 
} 

そして、この警告メッセージの後

は、セッションが閉じられています。

 
java.lang.IllegalStateException: Session/EntityManager is closed 
    at org.hibernate.internal.AbstractSharedSessionContract.checkOpen(AbstractSharedSessionContract.java:337) 
    at org.hibernate.engine.spi.SharedSessionContractImplementor.checkOpen(SharedSessionContractImplementor.java:135) 
    at org.hibernate.internal.AbstractSharedSessionContract.checkOpenOrWaitingForAutoClose(AbstractSharedSessionContract.java:343) 
    at org.hibernate.internal.SessionImpl.getPersistenceContext(SessionImpl.java:2275) 
    ... 

どうしたのですか?

+0

なぜアンサーフックを削除しましたか? – thst

答えて

0

2つのスレッドで永続オブジェクトを管理したり、2つの異なるセッションから収集したオブジェクトを混在させたり、一時オブジェクトのコレクションにオブジェクトを追加して後で保存しようとするとしかし、別のメッセージです)。

すべてのケースでは、セッション管理が不適切なものになります。

public PlayerEntity setHomeChests(Set<HomeChestEntity> homeChests) { 
    this.homeChests = homeChests; 
    return this; 
} 

あなたはおそらく(this.homeChestsフィールド内)の関係を交換するプロパティで指定された過渡セットで:

あなたの問題は、このコードです。

よりよい解決策は次のようになります。

if(this.homeChests == null) { 
    this.homeChests = new HashSet<>(homeChests); 
} 
else { 
    // very simply, you possibly better sync the new elements in... 
    this.homeChests.addAll(homeChests); 
} 

このソリューションは、あなたが保証できない場合、それは要素がすべて新しいしていること、また、問題のしています。古いオブジェクトにも遭遇するかもしれません。

私が言ったように、セッション処理がツリー上のすべての操作をカバーするように注意する必要があります。一時的なオブジェクトを新しいセッションで使用するだけではなく、それらをマージするか、再度ロードする必要があります。私はあなたが慎重にセッションの処理を休止状態についてのstackoverflowに関する質問を見ることをお勧めします。また、Hibernateのドキュメントには、セッションやHibernateを持つエンティティマネージャを管理する方法に関するいくつかのベストプラクティスがあります。

+0

こんにちは:) githubでエラーが見つかりました。それがどのように呼び出されたか私に説明できますか? [エラーの例はこちら](https://github.com/hibernate/hibernate-orm/blob/0a2a5c622e3eb30724e80bc8661c0ac55ebfb2be/hibernate-core/src/test/java/org/hibernate/test/collection/multisession/MultipleSessionCollectionWarningTest.java# L70) –

+0

コメントを見てください://セッションを解除せずにPersistenceContextからコレクションを削除します\t \t //これは実際には行わないでください。このエラーは実名がないことをテストするためだけにここで行われます。あなたはセッションでそれを一時的なコレクションと呼ぶことができます – thst