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.