I have not checked Gilead. I'm checking it. On Fri, Dec 16, 2011 at 1:19 PM, Alfredo Quiroga-Villamil <[email protected]> wrote: > Nestor is right on! > > I have heavily used Gilead > (http://noon.gilead.free.fr/gilead/index.php?page=gwt) which solves exactly > this: > > "The problem with Hibernate and > any framework that serializes POJOs (GWT, WebServices, JSON, etc) is > that Hibernate does not return POJOs, but Proxies of your POJOs. So > basically the solution to this problem is to clean your objects > returned by Hibernate to convert them to POJOs" > > In fact, I prefer using gilead any day over RF. This probably sounds > controversial I know and I is not intended to spark further comparison > between the two approaches. Using gilead I have POJO's under /shared that > are really entities and this is all handled transparently by gilead. > > Regards, > > Alfredo > > 2011/12/16 Néstor Boscán <[email protected]> >> >> Hi Alex >> >> I have donde this with many projects. The problem with Hibernate and >> any framework that serializes POJOs (GWT, WebServices, JSON, etc) is >> that Hibernate does not return POJOs, but Proxies of your POJOs. So >> basically the solution to this problem is to clean your objects >> returned by Hibernate to convert them to POJOs. I've seen examples >> from Google that they just basically write code to create the POJO's >> again and set the attributes but we prefer to use a Cleaner class that >> automatically does this job. >> >> The other problem is that you have to be careful when you save because >> you are passing to hibernate an object that is not a proxy. This >> causes problems when you're saving an object with collections. The >> objects in the new collection will be inserted but the old objects >> will not be deleted from the database. So one workaround is to load >> the object from the database and set the attributes, clean the >> collections (this will erase the objects from the database), and add >> the new objects. >> >> import java.beans.PropertyDescriptor; >> >> import java.io.InputStream; >> >> import java.util.ArrayList; >> import java.util.Date; >> import java.util.HashMap; >> import java.util.HashSet; >> import java.util.Map; >> import java.util.Set; >> import java.util.List; >> >> import org.apache.commons.beanutils.PropertyUtils; >> >> import org.hibernate.EntityMode; >> import org.hibernate.Hibernate; >> import org.hibernate.Session; >> import org.hibernate.metadata.ClassMetadata; >> import org.hibernate.proxy.HibernateProxyHelper; >> >> import java.io.Serializable; >> >> import java.sql.Blob; >> >> import java.util.*; >> >> import org.apache.log4j.Logger; >> >> import org.hibernate.proxy.HibernateProxy; >> >> public class HibernateCleaner { >> private static final Logger logger = >> Logger.getLogger(HibernateCleaner.class); >> >> public static Object clean(Session session, Object obj) throws >> Exception { >> return (clean(session, obj, new HashMap<Class, Map<Object, >> Object>>())); >> } >> >> private static Object clean(Session session, >> Object obj, >> Map<Class, Map<Object, Object>> >> visitedObjects) throws Exception { >> Object newObj, value = null, cleanValue = null; >> Map.Entry m; >> Class clazz; >> Object[] array; >> Collection collection; >> Map map; >> PropertyDescriptor[] descriptors; >> String property; >> ClassMetadata clazzMetaData; >> Map<Object, Object> visitedObjectsInClass; >> int index, length, hashCode; >> >> if (obj == null) >> return (null); >> >> if ((obj instanceof Boolean) || (obj instanceof Number) || >> (obj instanceof Character) || (obj instanceof String) || >> (obj instanceof Blob) || (obj instanceof InputStream)) >> return (obj); >> >> if (obj instanceof Date) >> return (new Date (((Date) obj).getTime())); >> >> if (obj instanceof Calendar) >> return (((Calendar) obj).clone()); >> >> if (obj instanceof Object[]) { >> array = (Object[]) ((Object[]) obj).clone(); >> length = array.length; >> for (index = 0; index < length; index++) >> array[index] = clean(session, array[index], >> visitedObjects); >> >> return (array); >> } >> >> if (obj instanceof Object[]) { >> array = (Object[]) ((Object[]) obj).clone(); >> length = array.length; >> for (index = 0; index < length; index++) >> array[index] = clean(session, array[index], >> visitedObjects); >> >> return (array); >> } >> >> if (obj instanceof Collection) { >> collection = createCollection((Collection) obj); >> >> if (Hibernate.isInitialized(obj)) { >> for (Object member: (Collection) obj) >> collection.add (clean(session, member, >> visitedObjects)); >> } >> >> return (collection); >> } >> >> if (obj instanceof Map) { >> map = createMap((Map) obj); >> >> if (Hibernate.isInitialized(obj)) { >> for (Object member: ((Map)obj).entrySet()) { >> m = (Map.Entry) member; >> clean(session, m.getKey(), visitedObjects); >> clean(session, m.getValue(), visitedObjects); >> map.put (m.getKey(), m.getValue()); >> } >> } >> >> return (map); >> } >> >> if (obj instanceof HibernateProxy) { >> clazz = >> HibernateProxyHelper.getClassWithoutInitializingProxy(obj); >> } else { >> clazz = obj.getClass(); >> } >> >> visitedObjectsInClass = visitedObjects.get(clazz); >> if (visitedObjectsInClass == null) { >> visitedObjectsInClass = new HashMap<Object, Object>(); >> visitedObjects.put(clazz, visitedObjectsInClass); >> } else if (visitedObjectsInClass.containsKey(obj)) { >> return visitedObjectsInClass.get(obj); >> } >> >> newObj = clazz.newInstance(); >> visitedObjectsInClass.put(obj, newObj); >> >> if (!Hibernate.isInitialized(obj)) { >> if (session != null) { >> clazzMetaData = >> session.getSessionFactory().getClassMetadata(newObj.getClass()); >> Serializable id = clazzMetaData.getIdentifier(obj, >> EntityMode.POJO); >> clazzMetaData.setIdentifier(newObj, id, EntityMode.POJO); >> } >> } else { >> descriptors = PropertyUtils.getPropertyDescriptors(newObj); >> length = descriptors.length; >> for (index = 0; index < length; index++) { >> property = descriptors[index].getName(); >> if (!property.equals("class")) { >> try { >> value = PropertyUtils.getProperty(obj, property); >> cleanValue = clean(session, value, visitedObjects); >> PropertyUtils.setProperty(newObj, property, >> cleanValue); >> } catch (NoSuchMethodException e) { >> } catch (Exception e) { >> if (logger.isInfoEnabled()) logger.info("Error >> Clean: " + obj.getClass() + " - " + property + " - " + >> value.getClass() + " - " + cleanValue.getClass()); >> throw(e); >> } >> } >> } >> } >> >> return (newObj); >> } >> >> private static Collection createCollection(Collection obj) throws >> Exception { >> Collection newObj = null; >> >> if (obj instanceof SortedSet) >> newObj = new TreeSet (); >> else if (obj instanceof Set) >> newObj = new HashSet (); >> else >> newObj = new ArrayList (); >> >> return (newObj); >> } >> >> private static Map createMap(Map obj) throws Exception { >> Map newObj = null; >> >> if (obj instanceof SortedMap) >> newObj = new TreeMap (); >> else >> newObj = new HashMap (); >> >> return (newObj); >> } >> } >> >> Hope this helps. >> >> Regards, >> >> Néstor Boscán >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Google Web Toolkit" group. >> To post to this group, send email to [email protected]. >> To unsubscribe from this group, send email to >> [email protected]. >> For more options, visit this group at >> http://groups.google.com/group/google-web-toolkit?hl=en. >> > > > > -- > Alfredo Quiroga-Villamil > > AOL/Yahoo/Gmail/MSN IM: lawwton > > > -- > You received this message because you are subscribed to the Google Groups > "Google Web Toolkit" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/google-web-toolkit?hl=en.
-- You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.
