我一直在尝试从实体 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);
}
}
}
最佳答案
对象克隆可能吗?克隆您想要序列化并通过网络发送的每个对象。您确实必须编写一个克隆方法,尽管您不会为每个 POJO 增加一个 DTO 类
关于hibernate - 从实体 pojo 中删除 Hibernate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8530850/