1.新建工程项目hibernate_many2many_2,在该项目下添加hibernate所需的Jar包和数据库mysql驱动Jar包。
2.编写工具类HibernateUtils和ExportDB,代码如下:
HibernateUtils.java
- package com.i51pro.hibernate;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- public class HibernateUtils {
- private static SessionFactory sessionFactory;
- static {
- try {
- Configuration cfg = new Configuration().configure();
- sessionFactory = cfg.buildSessionFactory();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static SessionFactory getSessionFactory() {
- return sessionFactory;
- }
- public static Session getSession() {
- return sessionFactory.openSession();
- }
- public static void closeSession(Session session) {
- if (session != null) {
- if (session.isOpen()) {
- session.close();
- }
- }
- }
- }
ExportDB.java
- package com.i51pro.hibernate;
- import org.hibernate.cfg.Configuration;
- import org.hibernate.tool.hbm2ddl.SchemaExport;
- public class ExportDB {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Configuration cfg = new Configuration().configure();
- SchemaExport export = new SchemaExport(cfg);
- export.create(true, true);
- }
- }
3.编写实体类和映射文件,代码如下:
Role.java
- package com.i51pro.hibernate;
- import java.util.Set;
- public class Role {
- private int id;
- private String name;
- private Set users;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Set getUsers() {
- return users;
- }
- public void setUsers(Set users) {
- this.users = users;
- }
- }
User.java
- package com.i51pro.hibernate;
- import java.util.Set;
- public class User {
- private int id;
- private String name;
- private Set roles;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Set getRoles() {
- return roles;
- }
- public void setRoles(Set roles) {
- this.roles = roles;
- }
- }
Role.hbm.xml
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.i51pro.hibernate.Role" table="t_role">
- <id name="id">
- <generator class="native" />
- </id>
- <property name="name"/>
- <set name="users" table="t_user_role" order-by="userid">
- <key column="roleid" />
- <many-to-many class="com.i51pro.hibernate.User" column="userid" />
- </set>
- </class>
- </hibernate-mapping>
User.hbm.xml
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.i51pro.hibernate.User" table="t_user">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <set name="roles" table="t_user_role">
- <key column="userid" />
- <many-to-many class="com.i51pro.hibernate.Role" column="roleid" />
- </set>
- </class>
- </hibernate-mapping>
4.编写hibernate映射文件,代码如下:
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_many2many_2</property>
- <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="hibernate.connection.username">root</property>
- <property name="hibernate.connection.password">admin</property>
- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
- <property name="hibernate.show_sql">true</property>
- <mapping resource="com/i51pro/hibernate/User.hbm.xml"/>
- <mapping resource="com/i51pro/hibernate/Role.hbm.xml"/>
- </session-factory>
- </hibernate-configuration>
5.在项目hibernate_many2many_2下新建SourceFolder,命名为test,在该包下编写测试类Many2Many2Test,进行单元测试,它的代码如下:
- package com.i51pro.hibernate;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.util.Set;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import junit.framework.TestCase;
- public class One2OneTest extends TestCase {
- public void testSave1() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- Transaction tx = session.beginTransaction();
- Role role1 = new Role();
- role1.setName("首席执行官");
- session.save(role1);
- Role role2 = new Role();
- role2.setName("总裁");
- session.save(role2);
- Role role3 = new Role();
- role3.setName("程序员");
- session.save(role3);
- User user1 = new User();
- user1.setName("张三");
- Set roles1 = new HashSet();
- roles1.add(role1);
- roles1.add(role2);
- user1.setRoles(roles1);
- User user2 = new User();
- user2.setName("李四");
- Set roles2 = new HashSet();
- roles2.add(role2);
- roles2.add(role3);
- user2.setRoles(roles2);
- User user3 = new User();
- user3.setName("王二");
- Set roles3 = new HashSet();
- roles3.add(role1);
- roles3.add(role2);
- roles3.add(role3);
- user3.setRoles(roles3);
- session.save(user1);
- session.save(user2);
- session.save(user3);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- public void testLoad() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- Transaction tx = session.beginTransaction();
- User user = (User)session.load(User.class, 1);
- System.out.println("user.name=" + user.getName());
- for(Iterator iter = user.getRoles().iterator(); iter.hasNext();) {
- Role role = (Role)iter.next();
- System.out.println("role.name=" + role.getName());
- }
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }
- }
- public void testLoad2() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- Role role = (Role)session.load(Role.class, 1);
- System.out.println(role.getName());
- for (Iterator iter=role.getUsers().iterator(); iter.hasNext();) {
- User user = (User)iter.next();
- System.out.println(user.getName());
- }
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- }
总结:
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属性值一致