2017-09-05 24 views
1

我正在运行一个Spring MVC项目,并希望有一个表单按钮将所有数据重置为新的Tomcat启动。我们使用Hibernate和import.sql脚本在开发环境中填充一些虚拟数据。我正在寻找一种解决方案,通过点击一个按钮,实例将简单地返回到此状态(因此本质上是一个create的休眠ddl-auto加上import.sql的导入)。这当然不会在生产中运行。如何重置Spring/Tomcat项目的所有数据?

如果这样做更容易,我也会开放翻译import.sql的内容为基于编程(基于Java配置)的解决方案。

对此问题可能有一个答案,但我还没有找到它。将它关闭,如果它是重复的。

回答

1

SO question是非常相似的,你需要做什么。

你需要做的就是点击按钮。

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;"); 

然后,你将需要调用buildSessionFactory方法,Hibernate提供了重新创建表。

我希望它有帮助。

+1

这似乎是迄今为止最接近的解决方案,但我有点惊讶没有更自动的东西。再过几天会提出这个问题。 – bphilipnyc

+0

很高兴为你效劳,将多看一看,看看我是否能找到更直接的东西。 –

0

为什么不使用相同的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]] 
+0

我的确切实现有一个缺点,就是你必须保持第二个sessionfactory打开,否则当你关闭它时会丢失你的数据库模式。但希望它给你一些有用的想法。 –

相关问题