我想在grails中建立一对一的关系并测试它。所以我创建了两个类。
下面有两个课程。
class Book {
String title
Date releaseDate
String ISBN
static belongsTo = [person:Person]
}
class Person {
Book book;
String name
Integer age
Date lastVisit
static constraints = {
book unique: true // "one-to-one". Without that = "Many-to-one".
}
}
写下测试:
public void testOneToOne() {
Person person1 = new Person(name:"person_b1", age: 99, lastVisit: new Date())
Person person2 = new Person(name:"person_b2", age: 100, lastVisit: new Date())
Book oneBook = new Book(title:"somebook", ISBN: "somebook1", releaseDate: new Date())
person1.setBook(oneBook)
person1.save()
person2.setBook(oneBook)
person2.save() // ! c'est impossible pour 'one-to-one'
}
因此,如果这是一对一的,我无法将person2保存到db,因为一本书无法链接到多个人。那么当person2.save()那么我有异常吗?
我没有。并且person2没有保存到db。那么我该如何测试 - 如何使测试失败?
答案 0 :(得分:0)
unique
约束用于确保类的一个实例只能连接到另一个类的单个实例:
http://grails.org/doc/latest/ref/Constraints/unique.html
在您的示例中,您将Book的一个实例加入到两个Person实例中,即一对多关联 - 因此保存失败是有道理的。如果您检查person2.errors.allErrors
属性,则应该看到违反了Person.book.unique
约束。
这就是一对一关联测试的样子 - person2
需要她自己的书,因为你宣称一本书只能属于一个unique
约束的人。
public void testOneToOne() {
Person person1 = new Person(name:"person_b1", age: 99, lastVisit: new Date())
Person person2 = new Person(name:"person_b2", age: 100, lastVisit: new Date())
Book oneBook = new Book(title:"somebook", ISBN: "somebook1", releaseDate: new Date())
Book twoBook = new Book(title:"anotherbook", ISBN: "somebook2", releaseDate: new Date())
person1.setBook(oneBook)
assertNotNull(person1.save())
person2.setBook(twoBook)
assertNotNull(person2.save())
}
看起来你真的想要一个(书)到很多(人)关联,所以只需要保留unique
约束。