Hibernate 建立双向多对多关联关系

来源:互联网 发布:java 适配器模式详解 编辑:程序博客网 时间:2024/06/08 12:00

在实际业务处理中,往往会存在很多复杂的数据关联关系,所以在使用 Hibernate 的时候需要掌握好,如何建立数据关联的不同关系,如单向一对多,单向多对一,单向多对多,双向一对多,双向多对多…….

现在记录学习如何在 Hibernate 中建立双向多对多的复杂关联关系:
以书店 BookStore 和书本 Book 为例子,一个书店存放很多不同类型的书,一本书可以在多家书店中存货,这样形成一种双向的多对多关系,下面来建立对应的类:
package com.wqt.POJO;
BookStore. java:

    private int bookStore_id;    private String bookStore_name;    private Set<Book> books;    ......//省略setter & getter & toString()

Book. java :

    private int book_id;    private String book_name;    priavte Set<BookStore> bookStores;    ......//省略setter & getter & toString()

在 hbm 文件中建立双向多对多的关联关系(核心部分):
BookStore.hbm.xml:

<set name="books" table="BookStore_Book" cascade="save-update">    <key column="bookStore_id"></key>    <many-to-many class="com.wqt.POJO.Book">         <column name="book_id" />    </many-to-many></set>

Book.hbm.xml:

<set name="bookStore" table="BookStore_Book" cascade="save-update">    <key column="book_id"></key>    <many-to-many class="com.wqt.POJO.BookStore">         <column name="bookStore_id">    </many-to-many></set>

从上面配置可以看到在 set 集合中关联到了一个 table=”BookStore_Book” ,这就是双向多对多关联关系的主要实现:通过关联表“BookStore_Book“来保存对象之间的关联关系,具体关联关系如图所示:
Book 表
BookStore 表
双向多对多关联关系表:
BookStore_Book 表

关联关系数据表建立完毕后,下面进行数据保存操作,并关联部分数据:
Main. java:

        BookStore bs1 = new BookStore();        BookStore bs2 = new BookStore();        BookStore bs3 = new BookStore();        bs1.setBookStore_name("新华书店");        bs2.setBookStore_name("国家图书馆");        bs3.setBookStore_name("Canada Library");        Book b1 = new Book();        Book b2 = new Book();        Book b3 = new Book();        Book b4 = new Book();        Book b5 = new Book();        b1.setBook_name("Oracle");        b2.setBook_name("Sun");        b3.setBook_name("Thinking in Java");        b4.setBook_name("国家通史");        b5.setBook_name("JVM");        // 设定关联关系        // 需要先初始化容器        bs1.setBooks(new HashSet<Book>());        bs2.setBooks(new HashSet<Book>());        bs3.setBooks(new HashSet<Book>());        b1.setBookStore(new HashSet<BookStore>());        b2.setBookStore(new HashSet<BookStore>());        b3.setBookStore(new HashSet<BookStore>());        b4.setBookStore(new HashSet<BookStore>());        b5.setBookStore(new HashSet<BookStore>());        //设定关联关系        bs1.getBooks().add(b1);        bs1.getBooks().add(b2);        bs1.getBooks().add(b5);        bs2.getBooks().add(b1);        bs2.getBooks().add(b4);        bs3.getBooks().add(b2);        bs3.getBooks().add(b3);        bs3.getBooks().add(b4);        bs3.getBooks().add(b5);        //保存插入到数据库中        session.save(bs1);        session.save(bs2);        session.save(bs3);        session.save(b1);        session.save(b2);        session.save(b3);        session.save(b4);        session.save(b5);

将书店 BookStore 和书本 Book 数据关联之后,保存到数据库中即可。

此处应注意切勿重复关联数据,否则会出现主键冲突错误;关联关系的确立,只需要其中一方将关系关联好即可,关联操作实际上相当于将书店 BookStore 和 书本Book 的主键一起保存到关联表 BookStore_Book 中去,所以不能存在重复的主键数据。

如有错漏,欢迎指出。

0 0
原创粉丝点击