2013-06-09 3 views
1

У меня есть веб-проект, в котором я использую Hibernate. Структура проекта:Не удается загрузить конфигурацию из /hibernate.cfg.xml

src 
| 
|--java 
| |--com.rusakov... 
| 
|--resources 
| |--hibernate.cfg.xml 
| 
|--webapp 
    |--WEB-INF 

Мой hibernate.cfg.xml выглядит следующим образом:

<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <!-- Database connection settings --> 
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="connection.url">jdbc:mysql://localhost:3306/computersdb</property> 
    <property name="connection.username">root</property> 
    <property name="connection.password">34902</property> 

    <!-- JDBC connection pool (use the built-in) --> 
    <property name="connection.pool_size">1</property> 

    <!-- SQL dialect --> 
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

    <!-- Echo all executed SQL to stdout --> 
    <property name="show_sql">true</property> 

    <!-- Drop and re-create the database schema on startup --> 
    <property name="hbm2ddl.auto">update</property> 

    <mapping package="com.rusakov.entities"/> 
    </session-factory> 
</hibernate-configuration> 

Мой класс для инициализации SessionFactory:

public class HibernateUtil { 
    private static SessionFactory sessionFactory = null; 

    public static SessionFactory getSessionFactory() { 
     if (sessionFactory == null) { 
      try { 
       Configuration configuration = new Configuration(); 
       configuration.configure(); 
       ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder() 
         .applySettings(configuration.getProperties()); 
       sessionFactory = configuration 
         .buildSessionFactory(serviceRegistryBuilder.buildServiceRegistry()); 
      } catch (HibernateException e) { 
       e.printStackTrace(); 
      } 
     } 
     return sessionFactory; 
    } 
} 

Entity класс:

public class UserEnt { 
    private int id; 
    private String login; 
    private String password; 
    private String name; 
    private String surname; 

    public UserEnt() {}; 

    //** setters and getters **// 
} 

Когда я пытаюсь сохранить User объект в базу данных я получаю это:

INFO: HHH000040: Configuration resource: /hibernate.cfg.xml 
org.hibernate.HibernateException: /hibernate.cfg.xml not found 

Мой класс, где я называю SessionFactory

package com.rusakov.util; 

import com.rusakov.entities.*; 

import org.hibernate.Session; 

public class test { 
    public static void main(String[] args) { 
     UserEnt user = new UserEnt(); 
     user.setName("test"); 
     user.setSurname("test"); 
     user.setLogin("test"); 
     user.setPassword("test"); 
     user.setRole("test"); 
     Session session = HibernateUtil.getSessionFactory().openSession(); 
     session.beginTransaction(); 
     session.save(user); 
     session.getTransaction().commit(); 
    } 
} 

Что я делаю не так?

ответ

2

Вот решение вашей проблемы: он работает над проектом.

Создайте файл hibernate.cfg.xml в корневой папке src.

Изображение hibernate.cfg.xml файл в Assessment проект, где искать.

hibernate.cfg.xml location

Если вы отлаживать метод getPath() вы найдете расположение hibernate.cfg.xml файла в вашем проекте.

SessionFactoryGroceries.java

import java.io.File; 
import java.net.URI; 

import org.apache.log4j.Logger; 
import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 

public class SessionFactoryGroceries extends BaseSessionFactory { 
    private static final Logger LOG = Logger.getLogger(SessionFactoryGroceries.class); 
    private static final ThreadLocal<Session> THREAD_LOCAL = new ThreadLocal<Session>(); 
    private static SessionFactory sessionFactory; 

private static URI configFile = null; 
private static String configFileLocation = ""; 
private static Configuration configuration = null; 
private static Long configurationFileTimestamp = null; 

public void getPath() { 
    configFileLocation = getClass().getProtectionDomain().getCodeSource().getLocation().getPath() + "hibernate.cfg.xml"; 
} 

/** 
* session factory will be rebuilded in the next call 
* 
*/ 

public static void setConfigFile(final String configFile) { 
    try { 
     if (configFile.startsWith("file:")) 
      setConfigFile(new URI(configFile)); 
     else 
      setConfigFile(new URI("file:" + configFile)); 
    } catch (Exception e) { 
     LOG.error("Failed to set config file to " + configFile + ": bad URI"); 
    } 
} 

public static void setConfigFile(final URI configURI) { 
    SessionFactoryGroceries.configFile = configURI; 
    sessionFactory = null; 
} 

/** 
* Returns the ThreadLocal Session instance. Lazy initialize the 
* <code>SessionFactory</code> if needed. 
* 
* @return Session 
* @throws HibernateException 
*/ 

public static synchronized Session getCurrentSession() { 
    SessionFactoryGroceries groceries = new SessionFactoryGroceries(); 
    groceries.getPath(); 
    if (didConfigFileChange()) 
     resetFactory(); 

    Session session = (Session) THREAD_LOCAL.get(); 

    if (session == null || !session.isOpen()) { 
     if (sessionFactory == null) 
      rebuildSessionFactory(); 

     if (sessionFactory == null) 
      session = null; 
     else 
      session = SessionEx.create(sessionFactory.openSession()); 

     THREAD_LOCAL.set(session); 
    } 

    if (session == null) 
     throw new RuntimeException("unable to create hibernate session to database."); 

    return session; 
} 

/** 
* Rebuild hibernate session factory 
* 
*/ 

@SuppressWarnings("deprecation") 
public static void rebuildSessionFactory() { 
    try { 
     LOG.debug("XSpace configuring hibernate from this file: " + configFile); 

     File file = new File(configFile); 

     if (file.exists() == false) 
      throw new RuntimeException("Could not find config file at location: " + configFile); 

     configuration = new Configuration(); 
     configuration.configure(file); 
     sessionFactory = configuration.buildSessionFactory(); 
    } catch (Exception e) { 
     LOG.error("%%%% Error Creating SessionFactory %%%%", e); 
     e.printStackTrace(); 
    } catch (Throwable e) { 
     LOG.error("%%%% Error Creating SessionFactory %%%%", e); 
     e.printStackTrace(); 
    } 
} 

private static Boolean didConfigFileChange() { 
    if (configFile == null) 
     setConfigFile(configFileLocation); // IF NULL USE THE DEFAULT LOCATION. 

    File file = new File(configFile); 

    if (file.exists() == false) 
     throw new RuntimeException("could not find configuration file! " + configFile); 

    Boolean changed = Boolean.FALSE; 
    Long currentTimestamp = file.lastModified(); 

    if (configurationFileTimestamp == null) { 
     configurationFileTimestamp = currentTimestamp; 
    } else { 
     if (configurationFileTimestamp.equals(currentTimestamp) == false) { 
      configurationFileTimestamp = currentTimestamp; 
      changed = true; 
     } 
    } 

    return changed; 
} 

private static void resetFactory() { 
    Session session = (Session) THREAD_LOCAL.get(); 

    if (session != null) { 
     session.close(); 
    } 

    THREAD_LOCAL.set(null); 

    final org.hibernate.SessionFactory factory = sessionFactory; 

    // wait 10 minutes then close the factory and any open connections on the old factory 

    new Thread() { 
     public void run() { 
      synchronized (this) { 
       try { 
        Thread.sleep(1000 * 60 * 10); 
        factory.close(); 
       } catch (Exception e) { 
        // don't care 
       } 
      } 
     } 
    }.start(); 

    sessionFactory = null; 
} 

}

Для закрытия сеанса после получения данных из базы данных.

BaseSessionFactory.Java

import org.hibernate.Session; 

public class BaseSessionFactory { 

    public static void closeSession(final Session session) { 
     if (session != null && session.isOpen()) { 
      try { 
       session.close(); 
      } catch (Exception e) { 
       // LOG.error("Failed to close session: " + e.toString()); 
      } 
     } 
    } 

} 

Для открытых спящем соединения вызова метода getCurrentSession() в

LoginBussiness.java

import org.apache.log4j.Logger; 
import org.hibernate.Criteria; 
import org.hibernate.Session; 
import org.hibernate.criterion.Criterion; 
import org.hibernate.criterion.Restrictions; 

import com.grocery.data.hibernate.Users; 
import com.grocery.hibernate.SessionFactoryGroceries; 

public class LoginBussiness { 
    public static final Logger LOG = Logger.getLogger(LoginBussiness.class); 

public String usersDetails(Integer loginId, String email, String password) { 
    String name = ""; 
    Session session = null; 
    try { 
     session = SessionFactoryGroceries.getCurrentSession(); 
     Criteria criteria = session.createCriteria(Users.class); 
     Criterion lhs = Restrictions.eq("userID", loginId); 
     Criterion rhs = Restrictions.eq("email", email); 
     criteria.add(Restrictions.or(lhs, rhs)); 
     criteria.add(Restrictions.eq("password", password)); 
     Users users = (Users) criteria.uniqueResult(); 
     if (users != null) { 
      name = users.getFirstName(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     LOG.error("Type of exception occured in userDetails() is --> "+e); 
    } finally { 
     SessionFactoryGroceries.closeSession(session); 
    } 
    return name; 
} 

}

, наконец, вы получите имя пользователя от Users POJO класс

1

Похоже, hibernate.cfq.xml не по классу дороги.

Попробуйте переместить ваш hibernate.cfq.xml в **/WEB-INF/classes/

Создать эту папку, если не существует.

Редактировать

Для меня решение ниже работает отлично

Configuration configuration = new Configuration(); 
    configuration.configure(Paths.get("/full","path","to","hibernate","config", "hibernate.cfg.xml").toFile()); 

Если предположить, что абсолютный путь:

/full/path/to/file/hibernate/config/hibernate.cfg.xml 
+0

Я переехал, но все еще имею эту проблему. Также он не работает, когда я пишу полный путь к этому файлу в файле configuration.configure(); –

+0

Отредактировал свой ответ – nkukhar

+0

Я действительно не знаю почему, но hibernate.cfg.xml не помещается в выходную папку, когда я развертываю приложение –

Смежные вопросы