3

誰かが@Any関係に対処する方法を教えてくれますか?

InteractionParticipate私は、ある種のメッセージング相互作用に参加したいすべての人が実装するインターフェースを持っています。InteractionMessageメッセージは、送信機と受信機を持つで表されます。InteractionParticipateどのエンティティ実装がメッセージの受信者 (または送信者) になるかわからないため、@Anyリレーションシップを使用する必要があります。

私はこれを読んでインスピレーションを得て、次のInteractionMessageように書きました。

@Any(metaColumn = @Column(name = "Transmitter_Type"))
@AnyMetaDef(
        idType = "long",
        metaType = "string",
        metaValues = {
                @MetaValue(value = "Applicant", targetEntity = Applicant.class),
                @MetaValue(value = "Vacancy", targetEntity = Vacancy.class)
        })
@JoinColumn(name = "Transmitter_Id")
@LazyToOne(LazyToOneOption.FALSE)
private InteractionParticipate transmitter;

@Any(metaColumn = @Column(name = "Receiver_Type"))
@AnyMetaDef(idType = "long", metaType = "string",
        metaValues = {
                @MetaValue(targetEntity = Applicant.class, value = "Applicant"),
                @MetaValue(targetEntity = Vacancy.class, value = "Vacancy")
        })
@JoinColumn(name = "Receiver_Id")
@LazyToOne(LazyToOneOption.FALSE)
private InteractionParticipate receiver;

データベースは適切に作成されており、エンティティが正しく保存されていることがわかります。InteractionMessageしかし、データベースから取得しようとすると

InteractionMessage メッセージ = (InteractionMessage) session.get(InteractionMessage.class, id);

メソッドが「org.hibernate.LazyInitializationException」例外をスローしたため、どちらreceiverも取得できないことに直面しています。評価できません... Vacancy_$$_javassist_49.toString()。(空席クラスは実施中です。)transmitterInteractionParticipate

@LazyToOne私はとでも遊んでみまし@LazyCollectionたが、失敗しました。

それを理解するのを手伝ってください。前もって感謝します!

4

1 に答える 1

1

デタッチされたオブジェクトのコレクションにアクセスしようとしています。デタッチされたオブジェクトは、セッションに接続されていないことを意味します。その結果、遅延コレクションにアクセスすると、例外が発生します。これは、さまざまな理由で発生する可能性があります。たとえば、フロントエンドからシリアル化によってオブジェクトを受け取ります。希望する結果に応じて、2 つの解決策が考えられます。

1) コレクションを積極的にフェッチするように定義できます。これは、親オブジェクトが初期化されるとすぐにコレクションが初期化されることを意味します。2) オブジェクトをマージし (T mergedObject em.merge(detachedObject);)、そのコレクションにアクセスできます。

小さな警告: em.merge() はマージされたオブジェクトを返します。ただし、古いものはまだ切り離されているため、マージされたものにアクセスすることを忘れないでください。

于 2013-01-07T00:47:39.737 に答える