我一直在尝试从实体pojo中删除Hibernate特定的细节(例如,当我需要将它们序列化并发送到远程计算机时),以下是我提出的代码。它的" initializeAndUnproxy()'取自Bozho给出的一个答案:Converting Hibernate proxy to real object我修改它以在其中调用递归方法。
我希望您对此代码的评论有关其缺点。例如。它不会删除' 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);
}
}
}
答案 0 :(得分:1)
对象克隆可能吗?克隆要通过网络序列化和发送的每个对象。您必须编写克隆方法,尽管每个POJO都没有额外的DTO类
答案 1 :(得分:-1)
我没有看到这一点。如果我理解正确
因此,由于集合中未初始化的代理,您可能仍会有延迟加载异常。您可能会向远程客户端传输超出必要的数据,这可能不需要所有toOne关联和初始化的所有集合。这样做当然会为数据库生成大量额外的查询。
我的观点是