从实体pojo中删除Hibernate?

时间:2011-12-16 07:01:15

标签: hibernate serialization pojo

我一直在尝试从实体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);
        }                       
    }
}

2 个答案:

答案 0 :(得分:1)

对象克隆可能吗?克隆要通过网络序列化和发送的每个对象。您必须编写克隆方法,尽管每个POJO都没有额外的DTO类

答案 1 :(得分:-1)

我没有看到这一点。如果我理解正确

  • 远程客户端仍然必须在其类路径中使用Hibernate jar,
  • 所有这一切都是以递归方式初始化实体的所有toOne关联

因此,由于集合中未初始化的代理,您可能仍会有延迟加载异常。您可能会向远程客户端传输超出必要的数据,这可能不需要所有toOne关联和初始化的所有集合。这样做当然会为数据库生成大量额外的查询。

我的观点是

  • 客户端紧密耦合到服务器,可能依赖于Hibernate,并使用分离的Hibernate实体。而且您应该只初始化客户端需要初始化的内容
  • 或客户端松散耦合,可能不依赖于Hibernate,然后您应该转移常见的DTO,并将您的实体转换为DTO。