2010-07-10 58 views
0

我知道SchemaExport應該是我的朋友。但我正在使用liquibase,並且想要執行DDL - 純粹的sql語句 - 從liquibase生成,以在每種測試方法之前重新創建數據庫。從休眠狀態執行DDL

您是否看到以下代碼存在問題?我不知道,這似乎是那麼複雜......

public static int executeScript(String sqlFileOnClasspath) { 
    Session sess = getSessionFactory().openSession(); 
    Transaction ta = sess.beginTransaction(); 
    int sqlCmd = 0; 

    try { 
     BufferedReader bReader = new BufferedReader(new InputStreamReader(
        Util.class.getResourceAsStream(sqlFileOnClasspath), "UTF-8")); 
     String line; 
     while ((line = bReader.readLine()) != null) { 
      if (line.startsWith("--") || line.trim().isEmpty()) 
       continue; 

      final String tmp = line; 
      sess.doWork(new Work() { 

       @Override 
       public void execute(Connection connection) throws SQLException { 
        connection.createStatement().execute(tmp); 
       } 
      }); 
      sqlCmd++; 
     } 
    } catch (Exception ex) { 
     log.error("Couldn't execute " + sqlFileOnClasspath, ex); 
    } finally { 
     ta.commit(); 
     sess.close(); 
    } 

    return sqlCmd; 
} 

BTW:對於liquibase你需要做的:

// remove all hibernate managed tables 
    SchemaExport schemaTool = new SchemaExport(getConfiguration()); 
    schemaTool.drop(false, true); 

    // DROP TABLE DATABASECHANGELOGLOCK; 
    // DROP TABLE DATABASECHANGELOG; 
    executeScript("/drop-none-hib.sql"); 

    // now execute the DDL statements from liquibase 
    int sqlCmd = executeScript("/schema.sql"); 
    log.info("Executed " + sqlCmd + " sql commands"); 

回答

1

安全

直接執行措手不及聲明可能導致SQL注入。然而,你似乎從靜態文件中讀取DDL語句,所以這不應該是一個問題,只是想說明一點。

異常處理

缺少完全,例如正確地關閉輸入流,連接等。另外,如果有任何SQLExceptions被拋出,它錯過了哪些語句失敗的詳細信息。 sqlCmd變量也計算失敗的語句,所以我懷疑這個計數器的用處。

解析SQL/DDL

您將測試--風格的註釋,但不爲/* */意見。那會讓你有一天感到痛苦。此外,解析器每行假定一條SQL語句。較長的語句可能是多行的,並以需要修剪的分號結尾。不知道liquibase如何生成語句,因此這可能不是一個真正的問題。

事務處理

DDL語句無法反正回滾,所以不知道該交易是有幫助的。如果我錯了,請糾正我。

否則,因爲它的測試,我看起來也很好。

+0

很酷,非常感謝!對於TA處理:我希望你知道它;-) – Karussell 2010-07-10 21:31:22

+1

當一個DDL執行成功時,一個COMMIT被隱式執行,所以你不能手動回滾。但是,如果DDL錯誤,它會自動回滾(例如,DROP TABLE將執行成功並且該表永遠消失,或者它不會工作,表存在且處於一致狀態)http://searchoracle.techtarget。 com/answer/Do-DDL-statements-roll-back-and-why – mhaller 2010-07-10 21:37:45

+0

再次感謝! (目前鏈接不工作:-() – Karussell 2010-07-11 21:45:48

0

你爲什麼不乾脆用hbm2ddl.auto配置?

還是使用事務測試,在每次測試之後將數據庫回滾到其原始狀態?

+0

在引擎蓋下使用SchemaExport我認爲=>正如我所說:liquibase創建+爲我管理DDL。 – Karussell 2010-07-10 21:14:53

+0

是的,我想過「交易測試」,但我經常在我的測試中提交一些東西,例如測試是否會拋出一些異常(獨特約束或樂觀鎖等) – Karussell 2010-07-10 21:18:17