使用动态代理解决Hibernate序列化,避免延迟加载问题 - 编程入门网
作者 佚名技术
来源 NET编程
浏览
发布时间 2012-06-15
); HibernateBeanSerializerAdvice beanSerializerAdvice = new HibernateBeanSerializerAdvice(); beanSerializerAdvice.setExcludesProperties(excludesProperties); pf.addAdvice(beanSerializerAdvice); this.proxy = (T)pf.getProxy (); } } public T getProxy(){ return this.proxy; } static private class HibernateBeanSerializerAdvice implements MethodInterceptor { private String[] excludesProperties = new String[0]; public String[] getExcludesProperties() { return excludesProperties; } public void setExcludesProperties (String[] excludesProperties) { this.excludesProperties = excludesProperties == null ? new String[0] : excludesProperties; } public Object invoke(MethodInvocation mi) throws Throwable { String propertyName = getPropertyName(mi.getMethod().getName ()); Class returnType = mi.getMethod().getReturnType(); if (propertyName == null) { return mi.proceed(); } if(! Hibernate.isPropertyInitialized(mi.getThis(), propertyName)) { return null; } if(isExclude(mi, propertyName)) { return null; } Object returnValue = mi.proceed(); return processReturnValue(returnType, returnValue); } private Object processReturnValue(Class returnType, Object returnValue) { if(returnValue == null) return null; if(Modifier.isFinal(returnType.getModifiers())) { return returnValue; } //This might be a lazy-collection so we need to double check if(!Hibernate.isInitialized(returnValue)) { return null; } //this is Hibernate Object if (returnValue instanceof HibernateProxy) { return new HibernateBeanSerializer(returnValue).getProxy(); }else if (returnValue instanceof PersistentCollection) { if (returnType.isAssignableFrom(Map.class)) { Map proxyMap = new LinkedHashMap(); Map map = (Map)returnValue; Set<Map.Entry> entrySet = map.entrySet(); for(Map.Entry entry : entrySet) { proxyMap.put(entry.getKey(), new HibernateBeanSerializer(entry.getValue())); } return proxyMap; } Collection proxyCollection = null; if(returnType.isAssignableFrom(Set.class)) { proxyCollection = new LinkedHashSet(); }else if(returnType.isAssignableFrom (List.class)) { proxyCollection = new ArrayList(); }else { return returnValue; } for(Object o : (Collection)returnValue) { proxyCollection.add(new HibernateBeanSerializer(o).getProxy()); } return proxyCollection; }else { return returnValue; } } private boolean isExclude(MethodInvocation mi, String propertyName) throws Throwable { for(String excludePropertyName : excludesProperties) { if (propertyName.equals(excludePropertyName)) { return true; } } return false; } private static String getPropertyName(String methodName) { String propertyName = null; if(methodName.startsWith("get")) { propertyName = methodName.substring("get".length()); }else if (methodName.startsWith("is")) { propertyName |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于使用动态代理解决Hibernate序列化,避免延迟加载问题 - 编程入门网的所有评论