Pessoal vai ai uma boa base para seu programa

essa é uma base boa para evitar grandes problemas pois passei por muitos

public class HibernateUtil {

    private static final SessionFactory sessionFactory;
    private static final ThreadLocal sessionThread = new ThreadLocal();
    private static final ThreadLocal transactionThread = new ThreadLocal();

    static {
        try {
            AnnotationConfiguration configuration = new AnnotationConfiguration();
            configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect");
            configuration.setProperty("hibernate.connection.datasource", "SeuPoll");//GlassFish
            //configuration.setProperty("hibernate.connection.datasource", "java:comp/env/SeuPoll");//no TomCat
            configuration.setProperty("hibernate.order_updates", "true");
            configuration.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.NoCacheProvider");
            configuration.setProperty("hibernate.show_sql", "false");
            configuration.setProperty("hibernate.format_sql", "true");
            configuration.setProperty("hibernate.current_session_context_class", "thread");

            Scanner.scan(Thread.currentThread().getContextClassLoader(), Collections.EMPTY_SET, Collections.EMPTY_SET, configuration);
            sessionFactory = configuration.buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() {
        if (sessionThread.get() == null) {
            Session session = sessionFactory.openSession();
            sessionThread.set(session);
        }
        return (Session) sessionThread.get();
    }

    public static void closeSession() {
        Session session = (Session) sessionThread.get();
        if (session != null && session.isOpen()) {
            sessionThread.set(null);
            session.close();
        }
    }

    public static void beginTransaction() {
        Transaction transaction = getSession().beginTransaction();
        transactionThread.set(transaction);
    }

    public static void commitTransaction() {
        Transaction transaction = (Transaction) transactionThread.get();
        if (transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack()) {
            transaction.commit();
            transactionThread.set(null);
        }
    }

    public static void rollbackTransaction() {
        Transaction transaction = (Transaction) transactionThread.get();
        if (transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack()) {
            transaction.rollback();
            transactionThread.set(null);
        }
    }
}
public class Scanner {

    private static AnnotationConfiguration anotacao;

    /**
     * Metodo principal para ser usado no Hibernate Util passando Exemplo
     * Scanner.scan(Thread.currentThread().getContextClassLoader(),Collections.EMPTY_SET, Collections.EMPTY_SET,configuration);
     * Parametro Principal é o ultimo parametro (configuration) que é as configurações lá no HibernateUtil
     * de acordo com a varredura do método será inclusa à esse parametro configuration
     */
    public static void scan(ClassLoader classLoader, Set<String> locations,Set<String> packages, AnnotationConfiguration configuration) throws ClassNotFoundException {

        Scanner.anotacao = configuration;

        if (!(classLoader instanceof URLClassLoader)) {
            return;
        }

        URLClassLoader urlLoader = (URLClassLoader) classLoader;
        URL[] urls = urlLoader.getURLs();
        
        for (URL url : urls) {
            String path = url.getFile();
            File location = null;
            try {
                if (!url.toString().contains("classes") && !url.toString().contains("lib")) {                    
                    continue;
                }
                location = new File(url.toURI());
            } catch (URISyntaxException e) {
                e.printStackTrace();
                return;
            }
            
            if (matchesAny(path, locations)) {
                if (location.isDirectory()) {

                    getClassesInDirectory(null, location, packages);
                } else {

                    getClassesInJar(location, packages);
                }
            }
        }
    }

    /**
     * Método que verifica se o diretorio atual é uma classe válida para ser usada
     * Obs : classe válida é um pacote que seja formado por cristaltemper e pojo, pois existe pacotes pojos
     * que não são da cristal temper
     */
    public static void subirClasse(String classe) throws ClassNotFoundException {
        if ((classe.indexOf("pojo") != -1)&& (classe.indexOf("suaempresa") != -1)) {
            System.out.println(classe.substring(0, classe.length() - 6).replaceAll("/", "."));
            anotacao.addAnnotatedClass(Class.forName(classe.substring(0, classe.length() - 6).replaceAll("/", ".")));
        }
    }

    /**
     * Método que varre os diretorios do projeto
     */
    public static void getClassesInDirectory(String parent, File location,
            Set<String> packagePatterns) throws ClassNotFoundException {
        File[] files = location.listFiles();
        StringBuilder builder = null;

        for (File file : files) {
            builder = new StringBuilder(100);
            builder.append(parent).append("/").append(file.getName());
            String packageOrClass = (parent == null ? file.getName() : builder.toString());

            if (file.isDirectory()) {
                getClassesInDirectory(packageOrClass, file, packagePatterns);
            } else if (file.getName().endsWith(".class")) {
                if (matchesAny(packageOrClass, packagePatterns)) {
                    //System.out.println(packageOrClass);
                    subirClasse(packageOrClass);
                }
            }
        }
    }

    /**
     * Método que varre os JArs inclusos ao projeto
     */
    public static void getClassesInJar(File location,
            Set<String> packagePatterns) throws ClassNotFoundException {
        try {
            JarFile jar = new JarFile(location);
            Enumeration entries = jar.entries();

            while (entries.hasMoreElements()) {
                ZipEntry entry = (ZipEntry) entries.nextElement();
                String name = entry.getName();
                if (!entry.isDirectory() && name.endsWith(".class")) {
                    if (matchesAny(name, packagePatterns)) {
                        //System.out.println(name);
                        subirClasse(name);
                    }
                }
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    /**
     * Método que faz uma pesquisa por parte tipo o LIKE '%pojo%'
     */
    public static boolean matchesAny(String text, Set<String> filters) {
        if (filters == null || filters.size() == 0) {
            return true;
        }
        for (String filter : filters) {
            if (text.indexOf(filter) != -1) {
                return true;
            }
        }
        return false;
    }
}

filtro

public class HibernateSessionRequestFilter implements Filter {

    public void init(FilterConfig config) throws ServletException {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HibernateUtil.beginTransaction();
		try {
            response.setContentType("text/html; charset=UTF-8");
			chain.doFilter(request, response);
			HibernateUtil.commitTransaction();
		} catch (HibernateException exception) {
			exception.printStackTrace();
			HibernateUtil.rollbackTransaction();
		} finally {
			HibernateUtil.closeSession();
		}
	}

	public void destroy() {
	}

}

outro dia posto mais a medida que forem precisando