是否必须有 hibernate.cfg.xml 文件进行配置

Posted

技术标签:

【中文标题】是否必须有 hibernate.cfg.xml 文件进行配置【英文标题】:Is it mandatory to have hibernate.cfg.xml file for configuration 【发布时间】:2012-02-08 11:07:09 【问题描述】:

我不想拥有 hibernate.cfg.xml 文件。相反,我想通过我的代码完成所有配置,如下所示。

private static final SessionFactory factory;
private static final Properties properties;

static

    properties = new Properties();
    properties.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
    properties.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/books");
    properties.setProperty("hibernate.connection.username", "jhtp7");
    properties.setProperty("hibernate.connection.password", "password");
    properties.setProperty("hibernate.show_sql", "com.mysql.jdbc.Driver");
    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");

    factory = new Configuration().setProperties(properties).configure().
                            buildSessionFactory();

我已经尝试过上述方法。但我面临的问题是hibernate抛出一个异常说“./hibernate.cfg.xml file missing”。

真的必须保留hibernate.cfg.xml 文件吗?

提前致谢

【问题讨论】:

【参考方案1】:

不,我不认为配置 xml 是强制性的。要解决您的问题,我认为您需要使用 org.hibernate.cfg.Configuration 类。看看这个链接:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html

基本上,你需要这样的东西

Configuration cfg = new Configuration()
.setProperty("hibernate.dialect", "com.mysql.jdbc.Driver")
.setProperty("hibernate.connection.datasource", "jdbc:mysql://localhost:3306/books")
.setProperty("hibernate.order_updates", "true");

然后创建你的 sessionFactory,你只需说,cfg.buildSessionFactory();

【讨论】:

【参考方案2】:

我相信这是因为您对Configuration 对象的configure() 调用。尝试删除它,休眠将不会查找不存在的文件。基本上,您是通过 properties 对象设置所有必需的属性,因此无需告诉 Hibernate 寻找 hibernate.cfg.xml 文件,这正是 configure() 方法所做的。

【讨论】:

【参考方案3】:

不,使用 hibernate.cfg.xml 不是强制性的。只是不要使用.configure()。 如果我们使用.configure(),Hibernate 会查找 hibernate.cfg.xml。

public class HibernateUtil 
    private static SessionFactory sessionFactory ;
    static 
        Configuration configuration = new Configuration();

        configuration.addAnnotatedClass (org.gradle.Person.class);
        configuration.setProperty("hibernate.connection.driver_class","com.mysql.jdbc.Driver");
        configuration.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/hibernate");                                
        configuration.setProperty("hibernate.connection.username", "root");     
        configuration.setProperty("hibernate.connection.password", "root");
        configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        configuration.setProperty("hibernate.hbm2ddl.auto", "update");
        configuration.setProperty("hibernate.show_sql", "true");
        configuration.setProperty(" hibernate.connection.pool_size", "10");

        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
        sessionFactory = configuration.buildSessionFactory(builder.build());
    
    public static SessionFactory getSessionFactory() 
        return sessionFactory;
    
 

【讨论】:

如果要在控制台上记录 sql 查询,请使用:configuration.setProperty("hibernate.show_sql", "true"); 那怎么指定映射呢? 这样:configuration.addAnnotatedClass(org.gradle.Person.class); 谢谢我这样做了。我在寻找类似 addPackages 或 addAnnotatedPackages 的东西。【参考方案4】:

基本上,您是通过 properties 对象设置所有必需的属性,因此没有真正需要告诉 Hibernate 寻找一个正是 配置的 hibernate.cfg.xml 文件() 方法。使用 hibernate.cfg.xml 不是强制性的。只是不要使用 .configure()。

static 
    try 
        Properties prop= new Properties();
        prop.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/hibernate");
        prop.setProperty("hibernate.connection.username", "root");
        prop.setProperty("hibernate.connection.password", "");
        prop.setProperty("dialect", "org.hibernate.dialect.MySQLDialect");

        concreteSessionFactory = new AnnotationConfiguration()
       .addPackage("com.concretepage.persistence")
               .addProperties(prop)
               .addAnnotatedClass(User.class)
               .buildSessionFactory();
     catch (Throwable ex) 
        throw new ExceptionInInitializerError(ex);
    

【讨论】:

以上是关于是否必须有 hibernate.cfg.xml 文件进行配置的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的主配置文件hibernate.cfg.xml

用hibernate.properties代替hibernate.cfg.xml配置常用的属性

hibernate.cfg.xml放在哪

hibernate.cfg.xml 和 applicationContext.xml的关系,

配置NHibernate hibernate.cfg.xml文件以获得更多连接字符串

hibernate.properties 与 hibernate.cfg.xml