Duplicates to be allowed in the mapping table for many to many relationship with extra column

扶醉桌前 提交于 2019-12-13 02:55:10

问题


I have two domain classes with many to many relationship with extra column.I created below domain classes by following the logic from the forums and still face an issue in saving the data in additional domain class.Roylaty is the additional column to save the value in the mapping table.

Below are the 3 domain classes:

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
    }
}

In one of my controllers i wrote the below logic:

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)

For both author and book, it works as expected i.e it won't allow duplicates and in the mapping table too. it won't allow duplicates but I want the output to be as below in the mapping table

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   

It won't save this value as it is considering the combination of author_id and book_id to be unique even though I did not set any composite key on id's in the mapping table.

What should I change in the mapping table to allow duplicates?


回答1:


Can you manually insert that row into the database? I suspect this is caused by your implementation of equals and hashcode on AuthorBook.

These two objects are the same: author=1;book=1;royalty=100 and author=1;book=1;royalty=500 because your equality methods are only comparing author and book.



来源:https://stackoverflow.com/questions/49509354/duplicates-to-be-allowed-in-the-mapping-table-for-many-to-many-relationship-with

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!