0

User と Topic の間には非常に単純な @ManyToMany 関係があります。

@ManyToMany(mappedBy = "users", fetch = FetchType.LAZY)
public Set<Topic> getTopics() {
    return topics;
}

このコレクションを Iterator でトラバースすると、返されるすべての要素が Topic エンティティのプロキシになります。そのクラス名は Topic_javassist_4 です。しかし、私が知っているように、コレクションは具象型の要素 (私の場合は「トピック」) で初期化する必要があります。コレクションの「トピック」がプロキシで埋め尽くされているのはなぜですか?

更新これは不可能に思えますが、そうです! すでにアクティブなトランザクションで、「トピック」コレクションをトラバースし、すべてのトピック エンティティのクラス名を出力します。

package_name.Topic_$$_javassist_4
package_name.Topic

同じコレクションで最初のトピックが初期化されておらず、2 番目のトピックが初期化されているのはなぜですか?

ところで、hibernate ログは select ステートメントを選択してトピック エンティティを選択し、値はコンソールに出力されます。コレクションからの両方のトピックのすべての正しい値です。

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

4

1 に答える 1

1

Topic との関係を LAZY として宣言しました。これは、ユーザーがフェッチされるたびに、本当に必要でない限り、関連付けられているトピックがフェッチされないことを意味します。プロキシは、これを実現するメカニズムです。

トランザクションの境界内からコレクションをトラバースしていますか、それともトピックを繰り返し処理した時点でトランザクションはすでに閉じられていますか? ユーザーをロードし、接続を閉じてから、トピックの繰り返しを開始したようですか?

于 2013-06-24T15:23:40.290 に答える