2010-10-14 89 views
4

我想使用Grails功能在有限的基礎上創建/更新數據庫表。具體來說,我希望Grails管理一些表格,但不是全部。grails限制表創建

有沒有辦法限制Grails管理的表格,還是一個全有或全無的命題?

回答

11

一般來說,這完全沒有關係,因爲Grails使用Hibernate的HBM2DDL功能。但是您可以使用自定義配置子類來攔截進程。下面是擴展GrailsAnnotationConfiguration,並覆蓋所有三個SQL生成方法的一個例子:

​​

你並不需要覆蓋所有三個,例如你可以讓創建通過但刪除更新。

這被註冊的grails-app/conf目錄/ DataSource.groovy中:

dataSource { 
    pooled = true 
    driverClassName = ... 
    username = ... 
    password = ... 
    configClass = com.yourcompany.yourapp.MyConfiguration 
} 

注意的是,類必須用Java編寫的,因爲在基類的私有方法與方法衝突的問題是Groovy增加了所有常規類。

+0

工作就像一個魅力!感謝伯特 – ptsw 2010-10-15 14:14:29

+0

有一個小的邏輯錯誤以下是修復 – ptsw 2010-10-15 16:31:15

+0

私有String []西梅(字符串[]腳本){ 名單修剪=新的ArrayList (); 爲(字符串命令:腳本)。{ boolean ignore = false; for(String ignoreName:IGNORE_NAMES){ if(command.toLowerCase().con tains(「table」+ ignoreName.toLowerCase()+「」)){ ignore = true; 休息; } } if(!ignore)pruned.add(command); } } return pruned.toArray(new String [pruned.size()]); } – ptsw 2010-10-15 16:31:40

2

感謝修復史蒂夫。我重新發布上面的修復程序,但格式化爲stackoverflow。當我第一次嘗試這個時,我錯過了原來的if (command.toLowerCase()...)在修復中反轉邏輯爲if (command.toLowerCase()...),這有效地使得它在我的config/DataSource.groovy中看起來像dbCreate = "create-drop"沒有任何效果。我甚至從HTML源代碼工作從該頁面看到代碼的預期換行,但還是錯過了:-(一旦我得到這個正確輸入邏輯的重要一點是偉大的工作。

private String[] prune(String[] script) { 
    List<String> pruned = new ArrayList<String>(); 
    for (String command : script) { 

     boolean ignore = false; 

     for (String ignoreName : IGNORE_NAMES) { 
      if (command.toLowerCase().contains(" table " + ignoreName.toLowerCase() + " ")) { 
       ignore = true; 
       break; 
      } 
     }  

     if (!ignore) { 
      pruned.add(command); 
     } 
    } 
    return pruned.toArray(new String[pruned.size()]); 
} 
+0

真棒肯!謝謝! – ptsw 2011-05-19 13:39:15