如何将Hibernate代理转换为实际实体对象在冬眠期间Session,我正在加载一些对象,其中一些由于延迟加载而作为代理加载。没关系,我不想把懒惰的负载关掉。但是稍后我需要通过RPC向GWT客户机发送一些对象(实际上是一个对象)。碰巧这个具体的对象是一个代理。所以我需要把它变成一个真实的物体。我在Hibernate中找不到像“物化”这样的方法。如何将一些对象从代理转换为知道它们的类和ID的reals?目前,我看到的唯一解决方案是将该对象从Hibernate的缓存中删除并重新加载,但是由于许多原因,它确实很糟糕。
3 回答

函数式编程
TA贡献1807条经验 获得超9个赞
public static <T> T initializeAndUnproxy(T entity) { if (entity == null) { throw new NullPointerException("Entity passed for initialization is null"); } Hibernate.initialize(entity); if (entity instanceof HibernateProxy) { entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer() .getImplementation(); } return entity;}

跃然一笑
TA贡献1826条经验 获得超6个赞
因为Hibernate ORM 5.2.10,您可以这样做:
Object unproxiedEntity = Hibernate.unproxy( proxy );
在冬眠之前5.2.10。最简单的方法是使用非代理Hibernate内部提供的方法PersistenceContext
执行情况:
Object unproxiedEntity = ((SessionImplementor) session) .getPersistenceContext() .unproxy(proxy);

子衿沉夜
TA贡献1828条经验 获得超3个赞
public class PersistenceUtils { private static void cleanFromProxies(Object value, List<Object> handledObjects) { if ((value != null) && (!isProxy(value)) && !containsTotallyEqual(handledObjects, value)) { handledObjects.add(value); if (value instanceof Iterable) { for (Object item : (Iterable<?>) value) { cleanFromProxies(item, handledObjects); } } else if (value.getClass().isArray()) { for (Object item : (Object[]) value) { cleanFromProxies(item, handledObjects); } } BeanInfo beanInfo = null; try { beanInfo = Introspector.getBeanInfo(value.getClass()); } catch (IntrospectionException e) { // LOGGER.warn(e.getMessage(), e); } if (beanInfo != null) { for (PropertyDescriptor property : beanInfo.getPropertyDescriptors()) { try { if ((property.getWriteMethod() != null) && (property.getReadMethod() != null)) { Object fieldValue = property.getReadMethod().invoke(value); if (isProxy(fieldValue)) { fieldValue = unproxyObject(fieldValue); property.getWriteMethod().invoke(value, fieldValue); } cleanFromProxies(fieldValue, handledObjects); } } catch (Exception e) { // LOGGER.warn(e.getMessage(), e); } } } } } public static <T> T cleanFromProxies(T value) { T result = unproxyObject(value); cleanFromProxies(result, new ArrayList<Object>()); return result; } private static boolean containsTotallyEqual(Collection<?> collection, Object value) { if (CollectionUtils.isEmpty(collection)) { return false; } for (Object object : collection) { if (object == value) { return true; } } return false; } public static boolean isProxy(Object value) { if (value == null) { return false; } if ((value instanceof HibernateProxy) || (value instanceof PersistentCollection)) { return true; } return false; } private static Object unproxyHibernateProxy(HibernateProxy hibernateProxy) { Object result = hibernateProxy.writeReplace(); if (!(result instanceof SerializableProxy)) { return result; } return null; } @SuppressWarnings("unchecked") private static <T> T unproxyObject(T object) { if (isProxy(object)) { if (object instanceof PersistentCollection) { PersistentCollection persistentCollection = (PersistentCollection) object; return (T) unproxyPersistentCollection(persistentCollection); } else if (object instanceof HibernateProxy) { HibernateProxy hibernateProxy = (HibernateProxy) object; return (T) unproxyHibernateProxy(hibernateProxy); } else { return null; } } return object; } private static Object unproxyPersistentCollection(PersistentCollection persistentCollection) { if (persistentCollection instanceof PersistentSet) { return unproxyPersistentSet((Map<?, ?>) persistentCollection.getStoredSnapshot()); } return persistentCollection.getStoredSnapshot(); } private static <T> Set<T> unproxyPersistentSet(Map<T, ?> persistenceSet) { return new LinkedHashSet<T>(persistenceSet.keySet()); }}
添加回答
举报
0/150
提交
取消