hibernate多对多关联映射(二)---双向关联

来源:互联网 发布:图论十大算法 编辑:程序博客网 时间:2024/04/29 04:31

1.新建工程项目hibernate_many2many_2,在该项目下添加hibernate所需的Jar包和数据库mysql驱动Jar包。

2.编写工具类HibernateUtils和ExportDB,代码如下:

    HibernateUtils.java

  1. package com.i51pro.hibernate;
  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.cfg.Configuration;
  5. public class HibernateUtils {
  6.     private static SessionFactory sessionFactory;
  7.     static {
  8.         try {
  9.             Configuration cfg = new Configuration().configure();
  10.             sessionFactory = cfg.buildSessionFactory();
  11.         } catch (Exception e) {
  12.             e.printStackTrace();
  13.         }
  14.     }
  15.     public static SessionFactory getSessionFactory() {
  16.         return sessionFactory;
  17.     }
  18.     public static Session getSession() {
  19.         return sessionFactory.openSession();
  20.     }
  21.     public static void closeSession(Session session) {
  22.         if (session != null) {
  23.             if (session.isOpen()) {
  24.                 session.close();
  25.             }
  26.         }
  27.     }
  28. }

 

    ExportDB.java

  1. package com.i51pro.hibernate;
  2. import org.hibernate.cfg.Configuration;
  3. import org.hibernate.tool.hbm2ddl.SchemaExport;
  4. public class ExportDB {
  5.     /**
  6.      * @param args
  7.      */
  8.     public static void main(String[] args) {
  9.         Configuration cfg = new Configuration().configure();
  10.         
  11.         SchemaExport export = new SchemaExport(cfg);
  12.         export.create(truetrue);
  13.     }
  14. }

3.编写实体类和映射文件,代码如下:

    Role.java

  1. package com.i51pro.hibernate;
  2. import java.util.Set;
  3. public class Role {
  4.     private int id;
  5.     
  6.     private String name;
  7.     private Set users;
  8.     
  9.     public int getId() {
  10.         return id;
  11.     }
  12.     public void setId(int id) {
  13.         this.id = id;
  14.     }
  15.     public String getName() {
  16.         return name;
  17.     }
  18.     public void setName(String name) {
  19.         this.name = name;
  20.     }
  21.     public Set getUsers() {
  22.         return users;
  23.     }
  24.     public void setUsers(Set users) {
  25.         this.users = users;
  26.     }
  27. }

    User.java

  1. package com.i51pro.hibernate;
  2. import java.util.Set;
  3. public class User {
  4.     private int id;
  5.     
  6.     private String name;
  7.     private Set roles;
  8.     
  9.     public int getId() {
  10.         return id;
  11.     }
  12.     public void setId(int id) {
  13.         this.id = id;
  14.     }
  15.     public String getName() {
  16.         return name;
  17.     }
  18.     public void setName(String name) {
  19.         this.name = name;
  20.     }
  21.     public Set getRoles() {
  22.         return roles;
  23.     }
  24.     public void setRoles(Set roles) {
  25.         this.roles = roles;
  26.     }
  27. }

    Role.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC 
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6.     <class name="com.i51pro.hibernate.Role" table="t_role">
  7.         <id name="id">
  8.             <generator class="native" />
  9.         </id>
  10.         <property name="name"/>
  11.         <set name="users" table="t_user_role" order-by="userid">
  12.             <key column="roleid" />
  13.             <many-to-many class="com.i51pro.hibernate.User" column="userid" />
  14.         </set>
  15.     </class>
  16. </hibernate-mapping>

 

    User.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC 
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6.     <class name="com.i51pro.hibernate.User" table="t_user">
  7.         <id name="id">
  8.             <generator class="native"/>
  9.         </id>
  10.         <property name="name"/>
  11.         <set name="roles" table="t_user_role">
  12.             <key column="userid" />
  13.             <many-to-many class="com.i51pro.hibernate.Role" column="roleid" />
  14.         </set>
  15.     </class>
  16. </hibernate-mapping>

 

4.编写hibernate映射文件,代码如下:

  1. <!DOCTYPE hibernate-configuration PUBLIC
  2.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  4. <hibernate-configuration>
  5.     <session-factory>
  6.         <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_many2many_2</property>
  7.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  8.         <property name="hibernate.connection.username">root</property>
  9.         <property name="hibernate.connection.password">admin</property>
  10.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  11.         <property name="hibernate.show_sql">true</property>
  12.         
  13.         <mapping resource="com/i51pro/hibernate/User.hbm.xml"/>
  14.         <mapping resource="com/i51pro/hibernate/Role.hbm.xml"/>
  15.     </session-factory>
  16. </hibernate-configuration>

5.在项目hibernate_many2many_2下新建SourceFolder,命名为test,在该包下编写测试类Many2Many2Test,进行单元测试,它的代码如下:

    

  1. package com.i51pro.hibernate;
  2. import java.util.HashSet;
  3. import java.util.Iterator;
  4. import java.util.Set;
  5. import org.hibernate.Session;
  6. import org.hibernate.Transaction;
  7. import junit.framework.TestCase;
  8. public class One2OneTest extends TestCase {
  9.     public void testSave1() {
  10.         Session session = null;
  11.         try {
  12.             session = HibernateUtils.getSession();
  13.             Transaction tx = session.beginTransaction();
  14.             
  15.             Role role1 = new Role();
  16.             role1.setName("首席执行官");
  17.             session.save(role1);
  18.             
  19.             Role role2 = new Role();
  20.             role2.setName("总裁");
  21.             session.save(role2);
  22.             
  23.             Role role3 = new Role();
  24.             role3.setName("程序员");
  25.             session.save(role3);
  26.             
  27.             User user1 = new User();
  28.             user1.setName("张三");
  29.             Set roles1 = new HashSet();
  30.             roles1.add(role1);
  31.             roles1.add(role2);
  32.             user1.setRoles(roles1);
  33.             
  34.             User user2 = new User();
  35.             user2.setName("李四");
  36.             Set roles2 = new HashSet();
  37.             roles2.add(role2);
  38.             roles2.add(role3);
  39.             user2.setRoles(roles2);
  40.             
  41.             User user3 = new User();
  42.             user3.setName("王二");
  43.             Set roles3 = new HashSet();
  44.             roles3.add(role1);
  45.             roles3.add(role2);
  46.             roles3.add(role3);
  47.             user3.setRoles(roles3);
  48.             
  49.             session.save(user1);
  50.             session.save(user2);
  51.             session.save(user3);
  52.             
  53.             
  54.             session.getTransaction().commit();
  55.         }catch(Exception e) {
  56.             e.printStackTrace();
  57.             session.getTransaction().rollback();
  58.         }finally {
  59.             HibernateUtils.closeSession(session);
  60.         }
  61.     }   
  62.         
  63.     public void testLoad() {
  64.         Session session = null;
  65.         try {
  66.             session = HibernateUtils.getSession();
  67.             Transaction tx = session.beginTransaction();
  68.             
  69.             User user = (User)session.load(User.class1);
  70.             System.out.println("user.name=" + user.getName());
  71.             for(Iterator iter = user.getRoles().iterator(); iter.hasNext();) {
  72.                 Role role = (Role)iter.next();
  73.                 System.out.println("role.name=" + role.getName());
  74.             }
  75.             
  76.             session.getTransaction().commit();
  77.         }catch(Exception e) {
  78.             e.printStackTrace();
  79.             session.getTransaction().rollback();
  80.         }
  81.     }
  82.     
  83.     public void testLoad2() {
  84.         Session session = null;
  85.         try {
  86.             session = HibernateUtils.getSession();
  87.             session.beginTransaction();
  88.             Role role = (Role)session.load(Role.class1);
  89.             System.out.println(role.getName());
  90.             for (Iterator iter=role.getUsers().iterator(); iter.hasNext();) {
  91.                 User user = (User)iter.next();
  92.                 System.out.println(user.getName());
  93.             }
  94.             session.getTransaction().commit();
  95.         }catch(Exception e) {
  96.             e.printStackTrace();
  97.             session.getTransaction().rollback();
  98.         }finally {
  99.             HibernateUtils.closeSession(session);
  100.         }
  101.     }       
  102. }

总结:

hibernate多对多关联映射(双向User<---->Role)

映射方法:
  <set name="roles" table="t_user_role">
   <key column="userid"/>
   <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
  </set>
table属性值必须和单向关联中的table属性值一致
<key>中column属性值要与单向关联中的<many-to-many>标签中的column属性值一致
在<many-to-many>中的column属性值要与单向关联中<key>标签的column属性值一致
 

原创粉丝点击