2011-12-05 9 views
1

はシナリオ1:belongsToのは

ポスト

class Post { 
String content 
Date dateCreated 
static constraints = { 
content(blank: false) 
} 
static belongsTo = [ user : User ] 
} 

ユーザー

class User { 
// existing code here 
static hasMany = [ posts : Post ] 
} 

その古典1 は、私は2つのクラスを持っています何かの関係。これらのクラスの統合テスト:

void testFirstPost() { 
def user = new User(userId: 'joe',password: 'secret').save() 
def post1 = new Post(content: "First post... W00t!") 
user.addToPosts(post1) 
def post2 = new Post(content: "Second post...") 
user.addToPosts(post2) } 

非常にうまく動作します。しかし、あなたのような他の二つのクラスを検討している場合:

シナリオ2:

ユーザー

class User { 
    String login 
    String password 
    Profile profile 
    Status status 
    static hasMany = [ holidays : Holiday ] 
    static constraints = { 
     login(unique:true,size:2..20) 
     password(size:2..20) //more to be added later! 
     profile(nullable:true) 
     company(nullable:true) 
    } 
    static belongsTo = [ company : Company ] 
} 

会社を:古典ワン再び

class Company { 
    String shortName; 
    String name 
    Date dateCreated 
    String region 
    String email 
    Address address 
    Status status 
    Long tel 
    Long fax 
    static hasMany = [ users : User] 
     static constraints = { 
     } 
    static mapping = { 
     address lazy:false 
     status lazy:false 
    } 
} 

多くの関係。

は、これらのクラスのために、私はこのようなテストを書かれている:

void testSaveUser() { 
     def status1 = new Status(name:"Busy") 
     status1.save(flush:true)   
     def user = new User(login:"anto",password:"anything", 
      status:status1) 
     assert user.save(flush:true, failOnError: true) 
    } 

であっても、このテストが正常に動作します。 の2番目のUserクラスでは、companyフィールドの制約をcompany(nullable:true)として作成しましたが、これを入れなかった場合は、上記のテスト(testSaveUser())が失敗します。

私は取得していますエラーはこれです:

Validation Error(s) occurred during save(): - Field error in object 'mnm.User' on field 'company': rejected value [null]; codes [mnm.User.company.nullable.error.mnm.User.company,mnm.User.company.nullable.error.company,mnm.User.company.nullable.error.mnm.Company,mnm.User.company.nullable.error,user.company.nullable.error.mnm.User.company,user.company.nullable.error.company,user.company.nullable.error.mnm.Company,user.company.nullable.error,mnm.User.company.nullable.mnm.User.company,mnm.User.company.nullable.company,mnm.User.company.nullable.mnm.Company,mnm.User.company.nullable,user.company.nullable.mnm.User.company,user.company.nullable.company,user.company.nullable.mnm.Company,user.company.nullable,nullable.mnm.User.company,nullable.company,nullable.mnm.Company,nullable]; arguments [company,class mnm.User]; default message [Property [{0}] of class [{1}] cannot be null] 
grails.validation.ValidationException: Validation Error(s) occurred during save(): 
- Field error in object 'mnm.User' on field 'company': rejected value [null]; codes [mnm.User.company.nullable.error.mnm.User.company,mnm.User.company.nullable.error.company,mnm.User.company.nullable.error.mnm.Company,mnm.User.company.nullable.error,user.company.nullable.error.mnm.User.company,user.company.nullable.error.company,user.company.nullable.error.mnm.Company,user.company.nullable.error,mnm.User.company.nullable.mnm.User.company,mnm.User.company.nullable.company,mnm.User.company.nullable.mnm.Company,mnm.User.company.nullable,user.company.nullable.mnm.User.company,user.company.nullable.company,user.company.nullable.mnm.Company,user.company.nullable,nullable.mnm.User.company,nullable.company,nullable.mnm.Company,nullable]; arguments [company,class mnm.User]; default message [Property [{0}] of class [{1}] cannot be null] 

    at mnm.UserIntegrationTests.testSaveUser(UserIntegrationTests.groovy:18) 

シナリオ2company(nullable:true)制約を追加するために私を強制しない理由の両方シナリオ1シナリオ2はが同じであっても?

(私はのGrails 1.3.7を使用し、同じバージョンの2つのシナリオを実行したんだということに注意してください!)事前に

感謝。

答えて

1

あなたはそれをsave前に、それはデフォルトの制約

で失敗しますので、何か他のもの belongsTo何かが、それはあなたのテストでは null

することはできませんデフォルトでは、あなたは(まだ)、ユーザに対してcompanyを設定していない場合

+0

ああ、もう一度私はこのルールを忘れています。今それは感謝tim_yatesさんの作品:) –

関連する問題