エンティティpojoからHibernate固有の詳細を削除することを実験しています(例えば、シリアル化してリモートマシンに送信する必要があるとき)。その 'initializeAndUnproxy()'は、Bozhoが与えた答えの1つから取られました:Converting Hibernate proxy to real objectと私はその中で再帰的メソッドを呼び出すように変更しました。エンティティpojoからHibernateを削除しますか?
このコードに関するご意見は、その短所についてお聞きしたいと思います。例えば。そこからタイプの「PersistentSet」を削除することはありません。だからあなたはどのような改善を提案しますか?
static <T> T initializeAndUnproxy(T entity) throws IllegalArgumentException, IllegalAccessException
{
if(entity == null)
{
throw new NullPointerException("Entity passed for initialization is null");
}
Hibernate.initialize(entity);
T ret = entity;
if(entity instanceof HibernateProxy)
{
ret = (T)((HibernateProxy)entity).getHibernateLazyInitializer().getImplementation();
initializeRecursively(ret);
}
return ret;
}
static void initializeRecursively(Object entity) throws IllegalArgumentException, IllegalAccessException
{
Class<?> clazz = entity.getClass();
Field[] fields = clazz.getDeclaredFields();
for(Field field : fields)
{
field.setAccessible(true);
Object obj = field.get(entity);
Hibernate.initialize(obj);
if(obj instanceof HibernateProxy)
{
obj = ((HibernateProxy)obj).getHibernateLazyInitializer().getImplementation();
field.set(entity, obj);
initializeRecursively(obj);
}
if(obj instanceof LazyInitializer)
{
obj = ((LazyInitializer)obj).getImplementation();
initializeRecursively(obj);
}
}
}
よくある点は、リモートマシンに送信するためのHibernate pojoオブジェクトのグラフ全体をシリアル化する必要があることです。そのマシンにはHibernateのjarファイルがないので、そのオブジェクトグラフからHibernateのすべてのトレースを削除する必要があります。私が示したコードはそれを行う試みですが、永続的なセットのようなものを削除しないので完全ではありません。では、このコードをどのように改善できますか? – shrini1000
私が言ったように、私は、99%のケースでは、クライアントはグラフ全体を必要としないと考えています。再帰的に、オブジェクトの全体グラフを双方向の関連付けで使用すると、データベースの半分を読み込むことができます。クライアントが実際に必要なものを含むDTOを定義し、このDTOをエンティティから取り込むようにします。 –
しかし、DTOは反パターンではありませんか?さらに、オブジェクトとその関連が小さい場合、それらを休止状態にしてから送信することは妥当ではありませんか? – shrini1000