【问题标题】:hibernate.hbm2ddl.auto - Create-Drop is not working in Hibernatehibernate.hbm2ddl.auto - Create-Drop 在 Hibernate 中不起作用
【发布时间】:2018-07-06 19:14:27
【问题描述】:

我正在使用 create-drop 进行休眠,但它不起作用。我正在重新启动我的项目,但它仍然没有删除我的旧表及其数据。

<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,我的应用程序休眠也没有删除任何表,也没有创建任何表。但是当我创建一个新对象并调用保存方法时,休眠删除了所有表并再次创建了所有表。所以我想到的可能是休眠的问题只是在有 sessionFactory 对象存在时才执行操作。我正在使用 Singleton 模式来创建 sessionFactry 对象。因此,在我不执行任何 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 不起作用

【问题讨论】:

  • @SergeyBrunov 抱歉,我没明白你想说什么。
  • 你能看看answer吗?你怎么看?
  • @SergeyBrunov 我已经检查了那个答案,并且我已经正确关闭了 sessionFactory。但是如果我错了,我脑海中又出现了一个问题,请纠正我。当 sessionFactory 正确创建时,Hibernate 将创建删除表,当我停止 tomcat 时,它将自动销毁 sessionFactory 对象。对吗?
  • @SergeyBrunov 这里发生了什么,当我启动服务器或运行我的应用程序时,它并没有创建或删除表。但是当我创建需要 sessionFactory 对象的新用户时,休眠删除并创建了所有表。我使用单例设计模式来创建 sessionFactory 对象。因此,在我执行任何 Db 操作之前,它不会创建 sessionFactory 对象,这可能是仅在运行应用程序时未删除或创建表的原因。因为只是运行应用程序不会创建 sessionFactory 对象。

标签: java hibernate hibernate-mapping


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-04-12
    • 2016-09-19
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多