2011-08-28 32 views
0

我開始對我的grails web-app進行更嚴格的測試,現在是從hsqldb移動到postgres的時候了。一切都差不多,但是我在創建測試數據時在Bootstrap中出現錯誤。 Hibernate在將一行插入數據庫之前會嘗試執行選擇。 不幸的是,這樣做時它不會將參數傳遞給select,並且我收到異常,說未指定參數1值。Grails(Hibernate)在插入之前沒有通過id參數值進行選擇

這裏是我的領域類:

class User { 

static constraints = { 
    deviceId(
      blank: false, 
      unique: true, 
    ) 
    userName(nullable: true, size: 5..15, blank: false, unique: true) 
    password(nullable: true, size: 5..15, blank: false) 
    email(nullable: true, email: true, blank: false, unique: true) 
    blockedUsers(unique: true) 
} 
static mapping = { 
    table "player" 
    deviceId indexColumn: [name: "deviceId", unique: true] 
} 
static mappedBy = [inbox: 'userTo', outbox: 'userFrom'] 
static hasMany = [profiles: Profile, inbox: Message, outbox: Message, blockedUsers: User] 

List<User> blockedUsers = new ArrayList<User>() 
String deviceId 
String userName 
String email 
String password 
Boolean readyForExport = false 
Boolean newUser = false 
[...] 
} 

所以沒有什麼特別的地方。 在此錯誤之前,我已經在其他域上使用了很多.save(flush:true)命令,並且一切正常。只是這一個引發錯誤:/

這些是負責此錯誤的行。

User userA = new User(userName: "test", password: "dkjughey3htg", email: "[email protected]", deviceId: 'intTestDevice') 
userA.save(flush:true) 

任何提示爲什麼會發生這種情況?

回答

1

我沒有測試過這一點,但我覺得你的問題是:

blockedUsers(unique:true) 

是否有一個原因,你指定blockedUsers作爲一個列表,而不是設置的格姆的默認?使用Set時,成員的唯一性是自動的,然後您不必使用唯一的約束,這不符合您對一對多屬性的要求。此外,這是不相關的,但明文密碼是頑皮的。

+0

嗨喬丹。你是對的,這個約束是阻止bootstrap的執行,然而...列表給了我一些設置不正確的順序。在這種情況下,它不是必需的,但是這樣做可能是因爲在其他幾個地方我們需要正確的順序,並且通過使用列表而非其他方式更容易實現它。是的......明文密碼是頑皮的,因爲它對Grails啓動的時間影響,所以我寧願將spring安全性作爲公共測試之前的最後一個步驟之一;)再次感謝! – Krystian

+0

很酷。如果您想使用列表,您可以執行自定義約束來測試唯一性,而不是內置的唯一約束。 –