如何在Hibernate上从JPA手动调用create-drop?

Mar*_*rga 8 java hibernate jpa jboss-arquillian

我需要这个进行集成测试.我的环境是JBoss 7,在Hibernate 4上使用JPA的EJB3,H2内存数据库和测试由Arquillian运行.我希望能够删除数据库并再次创建它将基于所有表persistence.xml和实体.我知道我可以在应用程序开始时通过指定:

<property name="hibernate.hbm2ddl.auto" value="create-drop" /> 
Run Code Online (Sandbox Code Playgroud)

但是我需要在第一次删除后从代码中手动执行此操作并创建发生.

可能吗?什么是最简单的方法?

Tar*_*rek 0

我认为您需要手动创建脚本。然后您可以使用ScriptRunner(复制项目中的类):

public class YourIntegrationTestClass {
    private String url = "test-db-url";
    private String user = "user";
    private String pass = "pass";

    // run this before the test
    public void prepareDB() {
        // executes a script stored in test/resources/cucumber
        try {
            // use your driver here
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection(url, user, pass);
            ScriptRunner runner = new ScriptRunner(conn, false, true);

            // use your db creation script here
            runner.runScript(new BufferedReader(new FileReader("createDB.sql")));
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    // run this after the tests
    public void dropDB() {
            // use your driver here
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection(url, user, pass);
            ScriptRunner runner = new ScriptRunner(conn, false, true);

            // use your db drop script here
            runner.runScript(new BufferedReader(new FileReader("dropDB.sql")));
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)