【问题标题】:Delete in hibernate many to many在休眠中删除多对多
【发布时间】:2016-01-18 03:03:13
【问题描述】:

我的 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);

但是,它在 áauthor_book 中保存了 6 条记录而不是 3 条,即存在重复记录。 如果我只使用:s.save(a1);s.save(a2) 或 s.save(b1);s.save(b2), 然后错误:

org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例:com.my.hibernate.association.model.Book

发生了。

那么,如何在多对多中保存和删除呢?

【问题讨论】:

    标签: hibernate many-to-many


    【解决方案1】:

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

        @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/

    【讨论】:

    • 我试过了,但是这个解决方案保存时失败了,请看我更新的帖子。
    • 是的,当前它会在更新时得到副本。这似乎是休眠的一些限制。但是对于临时解决方案,您可以在保存代码中删除此代码以防止重复:a1.setBooks(books); a2.setBooks(books2) 并在映射中将list 更改为set。这是一个权衡选项,但有了这个你可以有双向,删除​​可以在两侧。希望对您有所帮助!
    • 谢谢,这是删除 'a1.setBooks();a2.setBooks()' 后的替代方法
    猜你喜欢
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多