java - 无法从/hibernate.cfg.xml 加载配置

标签 java mysql hibernate

我有一个使用 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;
    }
}

实体类:

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

我做错了什么?

最佳答案

这是您问题的解决方案:它适用于我的项目。

src 的根文件夹中创建 hibernate.cfg.xml 文件。

图像 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;
}

用于在从数据库获取数据后关闭 session 。

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类中获取用户名

关于java - 无法从/hibernate.cfg.xml 加载配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17005263/

相关文章:

java - java和条件问题(生命游戏)

java - 如何在Fragment上实现这些Activity代码呢?

java - 使用嵌入式 jetty 创建网络界面

MySql 二进制查询

未找到 PHP fatal error 类

java - 如何在 Eclipse 中使用 Hibernate Tools 生成 DAO?

java - 如何从Mule批量发送消息到ActiveMQ

php - 使用jquery模态形式将数据插入MYSQL

java - JPA 标准 : Convert int to String then select from substring of resulting String

java - 如果没有 Activity 事务,保存无效 - hibernate&spring