Ограничение 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
.