我有一个我正在使用Hibernate的Web项目。项目结构如下:
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();
}
}
我做错了什么?
答案 0 :(得分:2)
以下是您的问题的解决方案:它适用于我的项目。
在hibernate.cfg.xml
的根文件夹中创建src
文件。
hibernate.cfg.xml
项目中Assessment
文件的图片。
如果您调试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());
}
}
}
}
对于
中打开的hibernate连接调用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 class
答案 1 :(得分:1)
看起来hibernate.cfg.xml
不在classpath下。
尝试将hibernate.cfg.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