Having moved over from Turbine to Struts, I just have a different approach accessing the Data. I'm using singleton Services with one ThreadLocal HibernateSession. To be more flexible in writing my own data access functions, I have used an abstract HibernateAction class, which encapsulates the actual code. Take my custom class UserService (extends BaseuserService, which extends BaseService) as an example:

    public User findUserByUsername(final String username) throws DataAccessException {
        return (User) execute(new HibernateAction() {
            public Object run(Session session) throws HibernateException {
                List l =
                    session.find("from user in class com.networkteam.om.User where user.username = ?",username,Hibernate.STRING);
                if (l != null && l.size() == 1)
                    return (User) l.get(0);
                else
                    return null;
            }
        });
    }
This allows me to avoid code duplication for exception handling, logging, transactions, session initialization, etc. The Code for the simple execute method (Used for select queries etc.) in the class BaseService looks like:
    protected Object execute(HibernateAction action) throws DataAccessException {
        Session session = null;
        try {
            session = HibernateSession.currentSession();
            return action.run(session);
        } catch (HibernateException e) {
            throw new DataAccessException(e);
        } finally {
            try {
                HibernateSession.closeSession();
            } catch (HibernateException e) {
                throw new DataAccessException(e);
            }
        }
    }
The transaction based method executeTransaction is a bit more complicated and should be used, whenever one or more objects need to be saved or deleted:
    protected Object executeTransaction(HibernateAction action) throws DataAccessException {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateSession.currentSession();
            tx = session.beginTransaction();
            Object o = action.run(session);
            tx.commit();
            return o;
        } catch (HibernateException e) {
            try {
                tx.rollback();
            } catch (HibernateException e1) {
                throw new DataAccessException(e1);
            }
            throw new RuntimeException(e);
        } finally {
            try {
                HibernateSession.closeSession();
            } catch (HibernateException e) {
                throw new DataAccessException(e);
            }
        }
    }
All Services have a base set of methods for fetching a single object (by PK), deleting a single object, saving a single object and getting a List of all objects. I have two Templates, one for the Base***Service (overwrites) and one for the ***Service (customizable, doesn't overwrite) which is almost empty.
Using the Services in any Struts Action or other class is really simple. For example an Action to change a Users Password :
    public class SaveDealerAction extends SecureAction
    {
        public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
        {

        ...

        String userName = userForm.getName();
        User aUser = UserService.getInstance().findUserByName(userName);

        aUser.setPassword("New Password");

        UserService.getInstance().saveUser(aUser);

        ...

        }
    }
This is how the templates look like:
BaseService template
/*
 * Created on 26.02.2004
 *
 * networkteam - the creative ones.
 *
 */
package ${class.PackageName}.service.base;

import java.util.List;

import com.networkteam.exceptions.DataAccessException;
import ${class.PackageName}.${class.ClassName};
import ${class.PackageName}.service.${class.ClassName}Service;

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Query;
import net.sf.hibernate.Session;

public class Base${class.ClassName}Service extends BaseService {
    private static ${class.ClassName}Service instance = null;

    protected Base${class.ClassName}Service() {
        persistanceClass = ${class.ClassName}.class;
    }

    /**
     * getInstance() returns the instance of the ${class.ClassName}Service singleton.
     *
     * @return ${class.ClassName}Service singleton.
     */
    public static synchronized ${class.ClassName}Service getInstance() {
        /*
         * Creates the Singleton instance, if needed.
         *
         */
        if (instance == null) {
            instance = new ${class.ClassName}Service();
        }
        return instance;
    }

    /**
     * get${class.ClassName}($class.Id.Property.Type id) returns the ${class.ClassName} Bean with the given id, or null when not existent.
     *
     * @param id - the Primary Key value
     * @return ${class.ClassName} Bean.
     */
    public ${class.ClassName} get${class.ClassName}($class.Id.Property.Type id) throws DataAccessException {
        return (${class.ClassName}) getByPK(id);
    }

    public List get${class.ClassName}List() throws DataAccessException {
        return (List) execute(new HibernateAction() {
            public Object run(Session session) throws HibernateException {
                Query q =
                    session.createQuery(
                        "select object from ${class.FullClassName} as object");
                return q.list();
            }
        });
    }

    public void save${class.ClassName}(${class.ClassName} object) throws DataAccessException {
        save(object);
    }

    public void delete${class.ClassName}(${class.ClassName} object) throws DataAccessException {
        delete(object);
    }

}
Service template
/*
 * Created on 26.02.2004
 *
 * networkteam - the creative ones.
 *
 */
package ${class.PackageName}.service;

import net.sf.hibernate.Hibernate;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;

import com.networkteam.exceptions.DataAccessException;
import ${class.PackageName}.${class.ClassName};
import ${class.PackageName}.service.base.Base${class.ClassName}Service;
import ${class.PackageName}.service.base.HibernateAction;

public class ${class.ClassName}Service extends Base${class.ClassName}Service {

    public ${class.ClassName}Service()    {
        super();
    }

}