ITEEDU

Hibernate-many-to-many映射

many-to-many

many-to-many是多对多的映射关系,如用户和角色。一个用户可能有多个角色,一个角色可能有多个用户。

多对多是用一个中间连接表边实现的,每一端的设置是一样的,对称的。

单向和双向的配制没有什么区别。

角色类

package com.iteedu.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;
	}
}

 角色映射文件

<?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.iteedu.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.iteedu.hibernate.User" column="userid"/>
		</set>
	</class>
</hibernate-mapping>

说明:

  1. set的table设置所用关联表,映射通过t_user_role来实现,t_user_role中为userid和roleid组成的复合主键。
  2. key为角色表要关联的关联表t_user_role中的列名。
  3. many-to-many的class设置集合中的对象类型为用户,column设置用户表中要关联的关联表t_user_role中的列名。

用户表关联t_user_role,角色表关联t_user_role,这样来实现多对多关联。

 用户类

package com.iteedu.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;
	}
}

 用户类映射文件

<?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.iteedu.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.iteedu.hibernate.Role" column="roleid"/>
		</set>
	</class>
</hibernate-mapping>

配制和角色一样。

调用

session.beginTransaction();

Role r1 = new Role();
r1.setName("role1");
session.save(r1);

Role r2 = new Role();
r2.setName("role2");
session.save(r2);

Role r3 = new Role();
r3.setName("role3");
session.save(r3);

User u1 = new User();
u1.setName("QQ");
Set u1Roles = new HashSet();
u1Roles.add(r1);
u1Roles.add(r2);
u1.setRoles(u1Roles);

User u2 = new User();
u2.setName("130");
Set u2Roles = new HashSet();
u2Roles.add(r2);
u2Roles.add(r3);
u2.setRoles(u2Roles);

User u3 = new User();
u3.setName("BAIDU");
Set u3Roles = new HashSet();
u3Roles.add(r1);
u3Roles.add(r2);
u3Roles.add(r3);
u3.setRoles(u3Roles);

session.save(u1);
session.save(u2);
session.save(u3);

session.getTransaction().commit();