[EJB 3.0] - Re: Detach entities - Obtaining a clear pojo
by fatbatman
Actually I think a better implementation is that included below;
it should certain perform much better as it now gets the inner hibernate collection object rather than creating a new object to replicate it.
Note - the package name so we can get the inner collection.
It still needs further testing, as I'm aware of couple of issues which I'll look at tomorrow
package org.hibernate.collection;
|
| import java.lang.annotation.Annotation;
| import java.lang.reflect.InvocationTargetException;
| import java.util.ArrayList;
| import java.util.Collection;
| import java.util.Map;
|
| import javax.persistence.Entity;
|
| import org.apache.commons.beanutils.PropertyUtils;
| import org.hibernate.LazyInitializationException;
|
| /**
| * Some utils methods to get a complete clean POJO from an entity bean with hibernate specific fields stripped out.
| * Note this class is not meant as a way of avoid LazyInitializationException's. Its purpose to strip out data before sending the object
| * to remote client so that does not have knowledge of hibernate classes.
| * @author ALR 5/9/2006
| * @author modified by James Adams 6/9/2006, 7/9/2006
| *
| */
| public class HibernateCleaner {
|
| public static Object clean(Object obj){
| return removePersistenceContext(obj, new ArrayList<Integer>(), 0);
| }
|
| /**
| * Checks if the object is an Entity bean by searching for the presence of
| * the @Entity tag in the objects class.
| * NOTE - If you are not using annotations to define your entity objects this function will not work
| * and require an alternative implementation.
| * @author James Adams
| */
| public static boolean isEntityBean(Object obj){
| for(Annotation a : obj.getClass().getAnnotations()){
| if(a.annotationType()==Entity.class){
| return true;
| }
| }
| return false;
| }
|
|
| /**
| * If the specified object's identity hash code is not in the specified
| * collection of visited hash codes, removes of all data binding the object
| * (and its members) to a specific persistence context, leaving intact only
| * model-centric data
| *
| * @param visitedObjectHashCodes
| * @param obj
| * @author ALR
| * @author James Adams, modified 6/9/2006,7/9/2006
| */
| private static Object removePersistenceContext(Object obj, Collection<Integer> visitedObjectHashCodes, int traverseLayer ){
| if(obj==null){
| return null;
| }
|
| if(visitedObjectHashCodes.contains(System.identityHashCode(obj))){
| return obj;
| }
|
| //Add the object's hash to the Collection of visited hash codes
| visitedObjectHashCodes.add(System.identityHashCode(obj));
|
| try{
| // If runtime type of persistentCollection is PersistentCollection get the inner collection
| if ((obj instanceof PersistentCollection))
| obj = getInnerCollection((PersistentCollection)obj);
| }catch(LazyInitializationException e){
| return null;
| }
|
| if(obj==null){
| return null;
| }
|
| //We always check all properties in the top layer object.
| if(traverseLayer>0 && !isEntityBean(obj) ){
| return obj;
| }
|
| Map allMembers = getInternalMembers(obj);
| for(Object member : allMembers.entrySet()){
| Map.Entry m = (Map.Entry)member;
| try {
| try{
| PropertyUtils.setProperty(obj, m.getKey().toString(), removePersistenceContext(m.getValue(), visitedObjectHashCodes, traverseLayer+1));
| }catch (LazyInitializationException e){
| PropertyUtils.setProperty(obj, m.getKey().toString(), null);
| }
| } catch (IllegalAccessException e) {
| throw new RuntimeException(e);
| } catch (InvocationTargetException e) {
| throw new RuntimeException(e);
| } catch (NoSuchMethodException e) {
| }
| }
|
| return obj;
| }
|
| /**
| * Because this class is in package org.hibernate.collection this method
| * allows us to access the inner protected fields of the hibernate collections
| * @param obj
| * @return The inner collection object of the PersistentCollection parameter
| * @author James Adams
| */
| protected static Object getInnerCollection(PersistentCollection obj){
| if(obj instanceof PersistentBag){
| return ((PersistentBag)obj).bag;
| }else if(obj instanceof PersistentList){
| return ((PersistentList)obj).list;
| }else if(obj instanceof PersistentSet){
| return ((PersistentSet)obj).set;
| }else if(obj instanceof PersistentMap){
| return ((PersistentMap)obj).map;
| }else if(obj instanceof PersistentSortedMap){
| return ((PersistentSortedMap)obj).map;
| }else if(obj instanceof PersistentSortedSet){
| return ((PersistentSortedSet)obj).set;
| }else{
| return null;
| }
| }
|
|
| /**
| * Returns a Map of all internal members of the specified object
| *
| * @param obj
| * The object for which to obtain internal members
| *
| * @author ALR
| * @see http://jakarta.apache.org/commons/beanutils/
| */
| private static Map getInternalMembers(Object obj){
| try {
| Map map = PropertyUtils.describe(obj);
| return map;
| } catch (IllegalAccessException e) {
| throw new RuntimeException(e);
| } catch (InvocationTargetException e) {
| throw new RuntimeException(e);
| } catch (NoSuchMethodException e) {
| throw new RuntimeException(e);
| }
| }
|
| }
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3969926#3969926
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3969926
19 years, 9 months
[JCA/JBoss] - Re: XA Connection error
by weston.price@jboss.com
Note, on the deployment stuff:
There is nothing to prevent you from deploying both a <local-tx-datasource> and <xa-datasource> at the same time in JBoss. Since you are looking things up via JNDI you can always change the JNDI name depending upon your needs so you wouldn't have to rework anything beyond changing the JNDI in the code when the time came to use XA.
Even better, use a resource-ref to introduce a logical binding between the WAR file and the underling JNDI resource. Check the Servlet/JSP spec for how to do this in JBoss. This would be the best best bet as you would only have to change the web.xml/jboss-web.xml files when the time came to make the switch.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3969925#3969925
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3969925
19 years, 9 months