6

ドメイン モデルを RESTful リソースとして公開する単純な webapp を開発しています。SpringMVC REST サポートで JPA2(Hibernate) を使用する予定です。

Hibernate エンティティを XML/JSON にマーシャリングしているときに、エンティティがデタッチされると、遅延子関連付けに対して LazyLoadingException がスローされます。エンティティがまだ Hibernate セッションにアタッチされている場合、ほぼデータベース全体がロードされます。

Dozer CustomFieldMapper を使用して、プロパティがロードされていない怠惰な Hibernate Collection であるかどうかを判断してから、NULL を返してみました。

しかし、双方向の関連付けがある場合、Hibernate は多対1の側を積極的にロードし、Dozer はプロパティをコピーしようとしますが、これが無限ループに陥り、StackOverflow エラーが発生します。

これを解決するために私が知っている唯一の回避策は、DTO を使用し、必要なプロパティをクリーンな POJO (DTO) にのみコピーしてから XML/JSON にマーシャリングすることです。しかし、複雑なドメイン モデルでプロパティを手動でコピーするのは非常に面倒です。

Hibernate エンティティを (非) マーシャリングする他のクリーンで簡単な方法はありますか?

4

3 に答える 3

4

保守的すぎるように聞こえるかもしれませんが、それでも DTO を使用することは良い考えだと思います。

マッピングの複雑さは、リソースの API の粒度に比例します。つまり、粗いほど複雑になります。

于 2013-01-03T09:02:32.363 に答える
3

GWTアプリケーションでHibernate'd VOを前後に渡すことで同様の問題が発生しました。一部のプロジェクトではDozerを使用して効果を上げ、他のプロジェクトではこの記事で説明されているアプローチを使用しました。これは基本的にマーシャリング前の休止状態プロキシを無効にします。

お役に立てば幸いです。

于 2013-01-03T09:02:05.127 に答える
2

このクラスで略奪してください: https://github.com/viniciuspires/reqlist/blob/master/src/main/java/org/reqlist/arch/HibernateAwareObjectMapper.java

Jackson を JSON シリアライザー/デシリアライザーとして使用しています。このクラスを作成し、Hibernate4Module を追加してHibernate.isInitialized、プロパティを誤って初期化しないようにする必要がありました。

その後、次の行で行ったように、それを として構成し、配列にObjectMapper渡すだけです。MessageConverters

https://github.com/viniciuspires/reqlist/blob/master/src/main/resources/META-INF/org.reqlist.context.xml#L21

それは私にとって魅力のように機能しました。

于 2015-03-12T20:42:59.577 に答える