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() {
}
}