在休眠中删除多对多

Delete in hibernate many to many

我的 pojos 如下:

@Entity
    @Table(name="author_mu")
    public class Author {
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private int id;
        private String name;
        @ManyToMany(cascade={CascadeType.PERGE,CascadeType.MERGE})
        @JoinTable(name="author_book",joinColumns=@JoinColumn(name="author_id"),
                inverseJoinColumns=@JoinColumn(name="book_id"))
        private List<Book> books;

@Entity
@Table(name="book_mu")
public class Book {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    private String name;
    @ManyToMany(cascade={CascadeType.PERGE,CascadeType.MERGE})
    @JoinTable(name="author_book",joinColumns=@JoinColumn(name="book_id"),
            inverseJoinColumns=@JoinColumn(name="author_id"))
    private List<Author> authors;

然后使用以下代码进行保存:

List<Author> authors = new ArrayList<Author>();
        List<Book> books = new ArrayList<Book>();
        List<Author> authors2 = new ArrayList<Author>();
        List<Book> books2 = new ArrayList<Book>();

        Author a1 = new Author();
        Author a2 = new Author();
        a1.setName("harry");
        a2.setName("gelin");
        authors.add(a1);
        authors.add(a2);
        authors2.add(a2);

        Book b1 = new Book();
        b1.setName("learn java in 30 days");
        Book b2 = new Book();
        b2.setName("stock market");     
        books.add(b1);
        books2.add(b1);
        books2.add(b2);

        a1.setBooks(books);
        a2.setBooks(books2);
        b1.setAuthors(authors);
        b2.setAuthors(authors2);

        s.save(a1);
        s.save(a2); 
        s.save(b1);
        s.save(b2);

但是áuthor_book里面存了6条记录而不是3条,那就是有重复的记录。 如果我只使用:s.save(a1);s.save(a2) 或 s.save(b1);s.save(b2), 然后错误:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.my.hibernate.association.model.Book

发生了。

那么,如何进行多对多的保存和删除呢?

您将需要在两个实体中定义映射,因此也请尝试在作者中定义映射:

    @Entity
    @Table(name="author_mu")
    public class Author {
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private int id;
        private String name;

        @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
        @JoinTable(name = "author_book",
        joinColumns = {@JoinColumn(name = "author_id")},
        inverseJoinColumns = @JoinColumn(name = "book_id"))
        private List<Book> books;

更多信息请参考:
Hibernate Bidirectional ManyToMany delete issue
http://outbottle.com/hibernate-manytomany-delete-non-owner-prevent-owner-being-deleted/