【发布时间】:2011-12-16 07:01:15
【问题描述】:
我一直在尝试从实体 pojo 中删除 Hibernate 特定细节(例如,当我需要序列化它们并发送到远程机器时),以下是我想出的代码。它的“initializeAndUnproxy()”取自 Bozho 给出的答案之一:Converting Hibernate proxy to real object,我对其进行了修改以在其中调用递归方法。
我希望您的 cmets 了解此代码的缺点。例如。它不会从中删除“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 serialization pojo