4 Replies Latest reply: Mar 10, 2009 3:41 PM by Stephen Friedrich RSS

    How to set auto trim on EntityManager?

    Shervin Asgari Master


      Is there a way to set auto trim on the entityManager in components.xml or something like that?
      Or maybe this is automatically done, I am not sure.

      I would like to say entity.setValue(  hello ) to be persisted automatically as hello in the database.

        • 1. Re: How to set auto trim on EntityManager?
          Colin Chang Newbie

          I am also interesting in this topic.
          But I think it is not good to trim the value in data access tier.
          This should be done by view/controller tier.
          Maybe you can define an annotation your self such as @Trim for javabeans which will automatically trim string value
          on getter methods.

          • 2. Re: How to set auto trim on EntityManager?
            Stuart Douglas Master

            You could add an Entity Listener in orm.xml that will accomplish this, you want it to listen to the pre-update and pre-persist events.

            I would have this entity listener use component.getInstance to call out to a custom application scoped seam component. In this components create method you do something like this:

            public class HibernateTrimmer
                class Prop
                   Method getter, setter;
                Map<Class, List<Prop>> propMap = new HashMap<Class, List<Prop>>();
                EntityManager entityManager;
                public void findAnnotatedClasses() throws NoSuchMethodException
                 HibernateSessionProxy es = (HibernateSessionProxy) entityManager
                 Map<String, ClassMetadata> map = es.getSessionFactory()
                 for (String s : map.keySet())
                     ClassMetadata m = map.get(s);
                     Class c = m.getMappedClass(EntityMode.POJO);
                     //scan through the properties using m.getPropertyNames() and m.getPropertyType()
                        //add all strink proiperties that you want to trim to the list
                        //using reflection to get the appropriate setter and getter
                public void doTrim(Object o) throws InvocationTargetException,
                 List<Prop> cls = propMap.get(o.getClass());
                 if (cls == null)
                 for (Prop m : cls)
                     String pb = m.getter.invoke(o);

            the code above is not complete, as I just ripped it out of a class of mine that does something similar (annotation based cache invalidation), but should give you the general idea.

            • 3. Re: How to set auto trim on EntityManager?
              Shervin Asgari Master

              Hmm, if it is that difficult then I will just write trim() manually :-)

              • 4. Re: How to set auto trim on EntityManager?
                Stephen Friedrich Novice

                If the problem are blanks that users accidentally enter into form fields, then a JSF converter would be the cleanest solution.
                Seam even makes this a little easier with an annotation:

                @Converter(forClass = String.class) registers a seam component as default converter for all string valued properties.