我有两个与额外列有很多关系的 Realm 类。我按照论坛中的逻辑创建了下面的 Realm 类,但在将数据保存到其他 Realm 类中时仍然遇到问题.Roylaty是在其中保存值的额外列映射表。
以下是3个域类:
class AuthorBook implements Serializable {
Author author
Book book
String royalty
boolean equals(other) {
if (!(other instanceof AuthorBook)) {
return false
}
other.author?.id == author?.id &&
other.book?.id == book?.id
}
int hashCode() {
def builder = new HashCodeBuilder()
if (author) builder.append(author.id)
if (book) builder.append(book.id)
builder.toHashCode()
}
static AuthorBook get(long authorId, long bookId) {
find 'from AuthorBook where author.id=:authorId and book.id=:bookId',
[authorId: authorId, bookId: bookId]
}
static AuthorBook create(Author author, Book book, boolean flush = false) {
new AuthorBook(author: author, book: book).save(flush: flush, insert: true)
}
}
class Author implements Serializable{
string name(nullable:false,unique:true)
Set<Book> getBooks() {
AuthorBook.findAllByAuthor(this).collect { it.book } as Set
}
}
class Book implements Serializable{
string title(nullable:false,unique:true)
Set<Author> getAuthors() {
AuthorBook.findAllByBook(this).collect { it.author } as Set
}
}
在我的一个 Controller 中,我编写了以下逻辑:
def author1 = new Author("ABC")
author.save(flush:true)
def book1= new Book("GORM")
book.save(flush:true)
def authorBook = new AuthorBook(royalty:100,author:author1,book:book1)
authorBook.save(flush:true)
对于作者和书籍,它都可以按预期工作,即,它也不允许重复,并且在映射表中也不允许。它不允许重复,但我希望输出如下表所示
Author AuthorBook Book
id Name id author_id book_id royalty id title
1 XYZ 1 1 1 500 1 Gorm
2 1 1 1000
它不会保存该值,因为即使我未在映射表中的id上设置任何复合键,它也将
author_id
和book_id
的组合视为唯一。我应该在映射表中进行哪些更改以允许重复?
最佳答案
您可以手动将该行插入数据库吗?我怀疑这是由您在equals
上实现hashcode
和AuthorBook
引起的。
这两个对象是相同的:author=1;book=1;royalty=100
和author=1;book=1;royalty=500
,因为您的相等方法仅比较作者和书籍。
关于grails - 映射表中允许与多余列进行多对多关系的重复项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49509354/