快速业务通道

使用动态代理解决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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号