1

I'm borrowing the "slice" meaning from C++.

Let's say I hava a simple POJO that's persisted via Hibernate:

class Person {
private long id;
private String name;
...
// getters and setters here
...
}

Now, when I retrieve an object from the database I know it was "instrumented" by Hibernate (its real class is a Person-derived generated automatically). I want to convert it back to a "plain" person object. Tnat would be used, for instance, to submit the object to XStream and have the result containing only what Person contains.

I could do it by defining a copy constructor, but I don't want to have the hassle of having to write copy constructors for every ORM class (not to mention the violation of DRY principle).

So I was wondering if

a) is there already a Java lib that does it? b) If not, would it be practical to write one using reflection?

In case of (b), any recomendations/guidelines/code skeletons would be appreciated.

4

4 に答える 4

3

Bean マッピング ライブラリのDozerは、この点で優れた機能を発揮し、非常に簡単に使用できます。

Hibernate によって返された Bean のインスタンスを独自のクラスにマップするだけです。

Person person = session.load(...);
BeanMapper mapper = ...;
Person cleanPerson = mapper.map(person, Person.class);

ほら、Hibernate プロキシや遅延ロードされたコレクションはもう必要ありません。

于 2010-07-22T00:37:01.163 に答える
1

ここにあなたの問題についての興味深い議論があります

http://www.mojavelinux.com/blog/archives/2006/06/hibernate_get_out_of_my_pojo/

コメントでは、いくつかの解決策が提案されています。特に

http://code.google.com/p/entity-pruner/

http://www.anzaan.com/2010/06/serializing-cglib-enhanced-proxy-into-json-using-xstream/

私は個人的にレイヤーの分離に非常に熱心であり、ネットワーク経由またはXMLにシリアル化するクラスは、実際にはデータアクセスレイヤークラスから分離する必要があると主張します。これにより、問題も解決します。

class SerializablePerson
{
   ... fields you care about ...
   SerializablePerson(Person person)
   {
      ... set only what you care about ... 
   }

}
于 2010-07-22T00:24:39.217 に答える
1

クラスorg.apache.commons.beanutils.BeanUtilsBeanはおそらくあなたが望むほとんどすべてを行います。copyPropertiesメソッドは、Entity で getter を呼び出し、指定したターゲット オブジェクトで一致するプロパティ名を持つ setter を探します。必要な動作の種類と、関係をマッピングするかどうか/方法に応じて、ネストされたエンティティを処理する必要がある場合があります。

より洗練されたものにする必要がある場合は、ネストされたエンティティ タイプを別のものに変換するための Converter を登録することもできます。

于 2010-07-22T00:12:37.370 に答える
0

次のように、永続的な対応物によってラップされた永続的な情報なしでPersonクラスを持つことができます。

public class Person implements Serializable
{
   private String name;
   // others.
}

public class PersistentPerson
{
   private Long id;
   private Person data; //

   public Person getPerson() { return this.data; } 
}

デザインがそれだけの価値があるかどうかはわかりません。デュアルモデルは、この例を書いている間、私を少し口の中に投げ込ませます。

より大きな問題は、なぜこれが必要だと思いますか?シリアル化するときにを含めないようにXStreamに指示する良い方法がない場合はid、独自に作成して、必要なものを取得する方がよいと思いjavax.xml.bind.Marshallerますjavax.xml.bind.Unmarshaller

デザイン全体をろくでなしにするよりも、この問題を解決するためのより良い方法があります。

于 2010-07-22T00:19:39.960 に答える