如何重置Spring/Tomcat项目的所有数据?

如何重置Spring/Tomcat项目的所有数据?,spring,hibernate,spring-mvc,Spring,Hibernate,Spring Mvc,我正在运行一个SpringMVC项目,希望有一个表单按钮,可以将所有数据重置为新的Tomcat启动。我们将Hibernate与一个import.sql脚本一起使用,以在开发环境中启动时填充一些虚拟数据。我正在寻找一种解决方案,通过该解决方案,只要点击一个按钮,实例就会返回到此状态(因此本质上是一个Hibernate ddl auto的create加上导入import.sql)。这当然不会在生产中运行 我还愿意将import.sql的内容转换为编程(基于Java配置)解决方案,如果这样做更容易的话

我正在运行一个SpringMVC项目,希望有一个表单按钮,可以将所有数据重置为新的Tomcat启动。我们将Hibernate与一个
import.sql
脚本一起使用,以在开发环境中启动时填充一些虚拟数据。我正在寻找一种解决方案,通过该解决方案,只要点击一个按钮,实例就会返回到此状态(因此本质上是一个Hibernate ddl auto的
create
加上导入
import.sql
)。这当然不会在生产中运行

我还愿意将import.sql的内容转换为编程(基于Java配置)解决方案,如果这样做更容易的话


这个问题可能已经有答案了,但我还没有找到。如果它是重复的,将关闭它。

为什么不使用相同的jdbcurl创建一个配置了“create drop”的新SessionFactory,然后加载并执行import.sql脚本的内容

@Test
public void test() {
    HsqlSessionFactoryCreator creator = HsqlSessionFactoryCreator.getInstance();
    try (SessionFactory sessionFactory1 = creator.create()) {
        try (Session session = sessionFactory1.openSession()) {
            Transaction transaction = session.beginTransaction();
            try {
                createEntity(...);

                transaction.commit();
            } catch (Throwable throwable) {
                transaction.rollback();
            }
        }

        try (Session session = sessionFactory1.openSession()) {
            System.err.println("SessionFactory1 " + session.createCriteria(MyEntity.class).list());
        }

        try (Session session = sessionFactory1.openSession()) {
            Transaction transaction = session.beginTransaction();
            try {
                createEntity(...);

                transaction.commit();
            } catch (Throwable throwable) {
                transaction.rollback();
            }
        }

        try (Session session = sessionFactory1.openSession()) {
            System.err.println("SessionFactory1 " + session.createCriteria(MyEntity.class).list());
        }

        try (SessionFactory sessionFactory2 = creator.create()) {
            try (Session session = sessionFactory1.openSession()) {
                System.err.println("SessionFactory1 after creating SessionFactory2 " + session.createCriteria(MyEntity.class).list());
            }
            try (Session session = sessionFactory2.openSession()) {
                System.err.println("SessionFactory2 " + session.createCriteria(MyEntity.class).list());
            }
            try (Session session = sessionFactory1.openSession()) {
                Transaction transaction = session.beginTransaction();
                try {
                    createEntity(...);

                    transaction.commit();
                } catch (Throwable throwable) {
                    transaction.rollback();
                }
            }
            try (Session session = sessionFactory1.openSession()) {
                System.err.println("SessionFactory1 " + session.createCriteria(MyEntity.class).list());
            }
            try (Session session = sessionFactory2.openSession()) {
                System.err.println("SessionFactory2 " + session.createCriteria(MyEntity.class).list());
            }
        }
    }
}
当我运行测试时(创建了一个SessionFactory,其中包含关于实体的知识),我得到了以下输出

SessionFactory1 [MyEntity[ID 9c81b1fa-04f5-4572-a945-e16d13ffc187]]
SessionFactory1 [MyEntity[ID 550e7c5d-6c8c-40ea-8f4b-cfdbf2d92075], MyEntity[ID 9c81b1fa-04f5-4572-a945-e16d13ffc187]]
SessionFactory1 after creating SessionFactory2 []
SessionFactory2 []
SessionFactory1 [MyEntity[ID 3748127d-6872-4d9c-84fb-1d83b85c9fe0]]
SessionFactory2 [MyEntity[ID 3748127d-6872-4d9c-84fb-1d83b85c9fe0]]
这与您需要做的非常相似

你需要做的是点击一下按钮

    Connection conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/?user=user&password=pass");
    Statement statement = (Statement) conn.createStatement();
    statement.executeUpdate("DROP DATABASE tcs;");
    statement.executeUpdate("CREATE DATABASE tcs charset=utf8 collate=utf8_persian_ci;");
然后需要调用hibernate提供的方法来重新创建表


我希望它能有所帮助。

我的确切实现有一个缺点,那就是您必须保持第二个sessionfactory处于打开状态,否则当您关闭它时,它会删除您的DB模式。但希望它能给你一些有用的想法。这似乎是迄今为止最接近的解决方案,尽管我有点惊讶没有比这更自动化的了。我会再问你几天。很高兴这个问题对你有用,我会多看看周围,看看我是否能找到更直接的问题。