2012-06-10 157 views
1

如何防止重複插入域類?Grails防止重複插入

Locations location = Locations.findByLocationXY(locationxy) 
     if (location == null) 
     { 

      LocationManagement lm = new LocationManagement() 
      location = lm.getSingaporeLocation(locationxy) 
      location.save(flush:true) 
     } 

class Locations { 

int id 
String locationName 
String locationXY 

static constraints = { 
    id(blank:false, unique:true) 
    locationName (blank:false) 
    locationXY (blank:false, unique:true) 
} 
def afterInsert = { 

id= this.id 
locationName = this.locationName 
locationXY = this.locationXY 
} 
+1

在您的商業模式中,什麼使得位置獨一無二? localtionXY?地點名稱 ?你應該簡單地能夠把該特性的約束 - 你不必檢查編號 –

+0

是的,有限制應用..我可以有一個之前插入和檢查? – user903772

回答

0

您不需要添加id的約束。這由grails自動完成。 我想如果你刪除這個,程序應該按照你的預期執行。唯一的唯一值就是locationXY。

+0

我在問如何防止插入相同的位置! – user903772

+0

這就是答案。如果唯一的唯一鍵是locationXY,那麼grails(數據庫)將不允許兩次插入相同的locationXY ...但是您在id上設置了兩個唯一的鍵(順便說一句,方法錯誤)。每個條目都自動生成。這就像沒有唯一的密鑰 – matcauthon

+0

好吧,讓它更清晰一點。刪除'id(blank:false,unique:true)'這一行'並檢查是否要插入同樣的'locationXY'引發的異常。 – matcauthon

4

您必須讓Grails處理這個問題 - 如果您以正確的方式定義您的約束,則不需要額外的代碼。

正如我所看到的,你已經有了一個

locationXY (blank:false, unique:true) 
從我從代碼讀取

所以,它不應該有可能與同locationXY插入另一個位置。

運行代碼後檢查了數據庫的內容嗎?你真的在你的餐桌上有兩條同樣的locationXY

BTW:你行,因爲你沒有指定failOnError:true

location.save(flush:true) 

不會拋出異常。所以下面的行可能會導致你期待什麼:

location.save(flush:true, failOnError:true) 

PS:什麼是您afterInsert代碼?爲清楚起見,我會刪除它。