我想建立一对一的关系并进行测试。所以我创建了两个类。
下面有两个类。
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保存到数据库,因为一本书无法链接到更多人。那么我应该在person2.save()发生异常的同时呢?
我没有而且person2不会保存到db。那么我该如何测试-如何使测试失败?
最佳答案
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
约束即可。