多对多双向关联

多对多双向关联
描述:书籍和类别的关系,多方持有多方的集合

  1. 创建持久化类
    `public class Book {
    /**
  • – 书本表
    create table t_hibernate_book
    (
    book_id int primary key auto_increment,
    book_name varchar(50) not null,
    price float not null
    );
    */

    private Integer book_id;
    private String book_name;
    private Set categories = new HashSet<>();

    public Book() {

    }

    public Integer getBook_id() {
    return book_id;
    }

    public void setBook_id(Integer book_id) {
    this.book_id = book_id;
    }

    public String getBook_name() {
    return book_name;
    }

    public void setBook_name(String book_name) {
    this.book_name = book_name;
    }

    public Set getCategories() {
    return categories;
    }

    public void setCategories(Set categories) {
    this.categories = categories;
    }

}
`**

public class Category {
/**
 * -- 书本类别表
create table t_hibernate_category
(
   category_id int primary key auto_increment,
   category_name varchar(50) not null
);

 */
	
	private Integer category_id;
	private String category_name;
	
	private Set<Book> books = new HashSet<>();
	
	public Category() {
		
	}

	public Integer getCategory_id() {
		return category_id;
	}

	public void setCategory_id(Integer category_id) {
		this.category_id = category_id;
	}

	public String getCategory_name() {
		return category_name;
	}

	public void setCategory_name(String category_name) {
		this.category_name = category_name;
	}

	public Set<Book> getBooks() {
		return books;
	}

	public void setBooks(Set<Book> books) {
		this.books = books;
	}
	
	

	
	
	

}

  1. 创建持久化类的映射文件
<hibernate-mapping>
    <class name="com.zking.five.hibernate.Book" table="t_hibernate_book">
        <id name="book_id" type="java.lang.Integer">
            <column name="book_id" />
            <generator class="assigned" />
        </id>
        <property name="book_name" type="java.lang.String">
            <column name="book_name" />
        </property>
        <set name="categories" inverse="false">
            <key>
                <column name="bid" />
            </key>
            <many-to-many class="com.zking.five.hibernate.Category" column="cid"/>
        </set>
    </class>
</hibernate-mapping>
<hibernate-mapping>
    <class name="com.zking.five.hibernate.Category" table="t_hibernate_category">
        <id name="category_id" type="java.lang.Integer">
            <column name="category_id" />
            <generator class="assigned" />
        </id>
        <property name="category_name" type="java.lang.String">
            <column name="category_name" />
        </property>
        <set name="books" inverse="false" table="t_hibernate_book_category">
            <key>
                <column name="cid" />
            </key>
            <!-- class 多方的全类名
            column 中间表字段
             -->
            <many-to-many class="com.zking.five.hibernate.Book" column="bid" />
        </set>
    </class>
</hibernate-mapping>
  1. 创建配置文件
<hibernate-configuration>
    <session-factory>
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    
     <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
    
     <property name="connection.username">root</property>
     
     <property name="connection.password">1920</property>
     
     <!-- 属性方言 -->
     <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
     
     <property name="show_sql">true</property>
     
     <property name="format_sql">true</property>
     <property name="hbm2ddl.auto">create</property>
     <!-- 本地事务(jdbc)getCurrentSession -->
     <property name="hibernate.current_session_context_class">thread</property>
     <!-- 全局事务 (jta)-->
   <!--   <property name="hibernate.current_session_context_class">jta</property> -->
     <!-- 引入实体类的映射文件 -->
     <!--一对一单向外键关联  -->
    <!--  <mapping class="oto_fk.Student"/>
     <mapping class="oto_fk.IdCard"/> -->
    <!--  一对一双向外键关联-->
   <!--  <mapping class="oto_bfk.Student"/>
    <mapping class="oto_bfk.IdCard"/> -->
    
    <!--多对一单向外键  -->
 <!--      <mapping class="mto_fk.Student"/>
    <mapping class="mto_fk.ClassRoom"/>  -->
    <!--多对一双向外键  -->
<!--      <mapping class="mto_bfk.Student"/>
    <mapping class="mto_bfk.ClassRoom"/> -->
    <!--多对多单向外键  -->
 <!--    <mapping class="mtm_fk.Student"/>
    <mapping class="mtm_fk.Teacher"/> -->
<!--     一对多自向关联
    <mapping resource="com/zking/five/hibernate/TreeNode.hbm.xml"/> -->
    <!--多对多双向关联  -->
    <mapping resource="com/zking/five/hibernate/Book.hbm.xml"/>
    <mapping resource="com/zking/five/hibernate/Category.hbm.xml"/>
    
    
    </session-factory>
</hibernate-configuration>

  1. 创建dao层
public class BookDao {

	public Book get(Book book) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Book book2 = session.get(book.getClass(), book.getBook_id());
//		Book book3 = session.load(book.getClass(), book.getBook_id());
		Hibernate.initialize(book2.getCategories());
        transaction.commit();
		return book2;
		
	}

}

  1. 创建junit测试
public class TestTreeNode {
private SessionFactory sessionFactory;
	
	private Session session;
	
	private Transaction transaction;
	
	private TreeNode s = null;
	private TreeNodeDao dao = null;
	
	private BookDao bookDao = null;
	
	
	@Before
	public void setUp() throws Exception {
		
		
		Configuration config = new Configuration().configure();
		
		
		sessionFactory =config.buildSessionFactory();
		
		
		session = sessionFactory.openSession();
		
		
		transaction = session.beginTransaction();
		
		dao = new TreeNodeDao();
		bookDao = new BookDao();
		
	}

	@After
	public void tearDown() throws Exception {
		
//		//提交事务
	    transaction.commit();
		//关闭会话
		session.close();
		//关闭会话工厂
		sessionFactory.close();
		
	}

	@Test
	public void testOpenSession() {
     
       
	
	}
	
	 @Test
	 public void testGetStudent() {
		 
		 
		   Book book = new Book();
	      book.setBook_id(4);
		 Book book2 = this.bookDao.get(book );
		 System.out.println(book2.getBook_name());
		 System.out.println(book2.getCategories());
		 for (Category c : book2.getCategories()) {
			System.out.println(c.getCategory_name());
		}
		
		
		 
		
	 }


	
	

}

  1. 控制台打印语句
Hibernate: 
    
    create table t_hibernate_book (
       book_id integer not null,
        book_name varchar(255),
        primary key (book_id)
    ) type=MyISAM
Hibernate: 
    
    create table t_hibernate_book_category (
       cid integer not null,
        bid integer not null,
        primary key (cid, bid)
    ) type=MyISAM
Hibernate: 
    
    create table t_hibernate_category (
       category_id integer not null,
        category_name varchar(255),
        primary key (category_id)
    ) type=MyISAM
Hibernate: 
    
    alter table Book_categories 
       add constraint FK59her4186gqvlvc91teyw1htw 
       foreign key (cid) 
       references t_hibernate_category (category_id)
Hibernate: 
    
    alter table Book_categories 
       add constraint FKf3ce8n8hcp7t5tq9bu01tbbru 
       foreign key (bid) 
       references t_hibernate_book (book_id)
Hibernate: 
    
    alter table t_hibernate_book_category 
       add constraint FKsatshu6s7jyjp1o4pbxgsou67 
       foreign key (bid) 
       references t_hibernate_book (book_id)
Hibernate: 
    
    alter table t_hibernate_book_category 
       add constraint FKen5rbwne9ce4o6r850p4j6fn8 
       foreign key (cid) 
       references t_hibernate_category (category_id)
十一月 25, 2018 8:58:23 下午 org.hibernate.tool.schema.internal.SchemaCreatorImpl applyImportSources
INFO: HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@2291d9a0'
十一月 25, 2018 8:58:23 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost:3306/hibernate]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值