hibernate.hbm2ddl.auto - Create-Drop在Hibernate中不起作用

时间:2018-01-27 17:25:08

标签: java hibernate hibernate-mapping

我正在使用create-drop进行hibernate,但它无法正常工作。我正在重新启动我的项目,但仍然没有放弃我的旧表及其数据。

<property name="hibernate.hbm2ddl.auto">create-drop</property>

hibernate.cfg.xml中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/HibernateConfiguration 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/demo</property>
<property name="connection.username">root</property>
<property name="connection.password">****</property>

<!-- SQL dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hibernate.hbm2ddl.auto">create-drop</property>
<property name="hibernate.current_session_context_class">thread</property>
<!-- Names the annotated entity class -->
<mapping class="domains.Test"/>
<mapping class="domains.LoginDetails"/>
<mapping class="domains.User"/>
</session-factory>
</hibernate-configuration>

我发现,我不知道我是错还是错。当我运行我的应用程序时,即使配置文件中提到了create-drop,hibernate也没有删除任何表也没有创建任何表。但是当我创建一个新对象并且调用save方法时,hibernate会删除所有表并再次创建所有表。因此,在我的脑海中提出的可能是休眠的问题只是在存在sessionFactory对象时才执行操作。我使用Singleton模式来创建sessionFacotry对象。因此,在我不进行任何CRUD操作之前,将不会创建sessionFactory对象,因此它不会丢弃或重新创建所有表。如果我错了,请纠正我。

public static SessionFactory sessionFactory;

private HibernateUtility(){}

public static SessionFactory getSessionFactory() {
    try{
        if (sessionFactory == null) {
            sessionFactory = new Configuration().configure().buildSessionFactory();
        }
    }catch(Exception e) {
        System.out.println(e);
    }

    return sessionFactory;
}

直到我从DAO hibernate调用此方法时才进行任何创建或删除表操作。这就是我想说的。直到sessionFactory对象未创建,create-drop才能正常工作

1 个答案:

答案 0 :(得分:1)

分析

(注意:这只是猜测。)

似乎SessionFactory接口的实例没有被关闭(由Tomcat?)。

解决方案

有必要配置Tomcat以适当地管理Hibernate的SessionFactory。请参阅:

  1. Using Hibernate with Tomcat |JBoss Developer
  2. TomcatHibernate - Tomcat Wiki
  3. Setup Hibernate Session Factory in Tomcat - Stack Overflow
  4. dev - Tomcat, JPA, Hibernate and MySQL。相关要点:Integrate Hibernate 4.1 in a raw Tomcat 7 (no JPA, no Spring, etc) · GitHub
  5. configure hibernate with embedded tomcat 7 programmatically - Stack Overflow