多对多双向关联

[code]一个简单示例:
一个雇员可以担任几个角色,一个角色可以拥有多个雇员,雇员和角色之间存在多对多的关联关系,
在这里我们建立多对多的双向关联...


db schema:
==============================


雇员表:

CREATE TABLE [employee] (
[eid] [int] IDENTITY (1, 1) NOT NULL ,
[ename] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[join_date] [datetime] NOT NULL ,
PRIMARY KEY CLUSTERED
(
[eid]
) ON [PRIMARY]
) ON [PRIMARY]
GO


角色表:

CREATE TABLE [role] (
[roleid] [int] IDENTITY (1, 1) NOT NULL ,
[rolename] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
PRIMARY KEY CLUSTERED
(
[roleid]
) ON [PRIMARY]
) ON [PRIMARY]
GO


雇员角色表:

CREATE TABLE [emp_role] (
[er_id] [int] IDENTITY (1, 1) NOT NULL ,
[er_eid] [int] NULL ,
[er_roleid] [int] NULL ,
PRIMARY KEY CLUSTERED
(
[er_id]
) ON [PRIMARY] ,
FOREIGN KEY
(
[er_eid]
) REFERENCES [employee] (
[eid]
),
FOREIGN KEY
(
[er_roleid]
) REFERENCES [role] (
[roleid]
)
) ON [PRIMARY]
GO

Employee.java
--------------------------
package com.supersit.hibernate.bean;

import java.util.Date;
import java.util.Set;

public class Employee implements java.io.Serializable,
com.supersit.hibernate.Interface.ObjectIn {

/**
*
*/
private static final long serialVersionUID = 1L;


//雇员编号
private Integer eid;

//雇员姓名
private String ename;

//入职时间
private java.util.Date join_date;


//角色集合
private java.util.Set<Role> roles = new java.util.HashSet<Role>();

public Employee(Integer eid, String ename, Date join_date) {
this.eid = eid;
this.ename = ename;
this.join_date = join_date;
}

public Employee(Integer eid, String ename, Date join_date, Set<Role> roles) {
this.eid = eid;
this.ename = ename;
this.join_date = join_date;
this.roles = roles;
}

public java.util.Set getRoles() {
return roles;
}

public void setRoles(java.util.Set<Role> roles) {
this.roles = roles;
}

public Employee() {
}

public Integer getEid() {
return eid;
}

public void setEid(Integer eid) {
this.eid = eid;
}

public String getEname() {
return ename;
}

public void setEname(String ename) {
this.ename = ename;
}

public java.util.Date getJoin_date() {
return join_date;
}

public void setJoin_date(java.util.Date join_date) {
this.join_date = join_date;
}

}


Role.java
------------------------------------
package com.supersit.hibernate.bean;

import java.util.Set;

public class Role implements java.io.Serializable,
com.supersit.hibernate.Interface.ObjectIn {


//角色编号
private Integer roleid;


//角色名称
private String rolename;


//此角色下的雇员集合
private java.util.Set emps = new java.util.HashSet();

public Role(Integer roleid, String rolename, Set emps) {
this.roleid = roleid;
this.rolename = rolename;
this.emps = emps;
}

public java.util.Set getEmps() {
return emps;
}

public void setEmps(java.util.Set emps) {
this.emps = emps;
}

public Role() {
}

public Integer getRoleid() {
return roleid;
}

public Role(Integer roleid, String rolename) {
this.roleid = roleid;
this.rolename = rolename;
}

public void setRoleid(Integer roleid) {
this.roleid = roleid;
}

public String getRolename() {
return rolename;
}

public void setRolename(String rolename) {
this.rolename = rolename;
}

}


配置文件:

hibernate.cfg.xml
------------------------------
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>

<session-factory>
<property name="connection.username">sa</property>
<property name="connection.url">
jdbc:microsoft:sqlserver://localhost:1433;databasename=hibernate
</property>
<property name="dialect">
org.hibernate.dialect.SQLServerDialect
</property>
<property name="connection.password">sa</property>
<property name="connection.driver_class">
com.microsoft.jdbc.sqlserver.SQLServerDriver
</property>
<property name="show_sql">true</property>
<mapping resource="com/supersit/hibernate/mapping/Employee.hbm.xml" />
<mapping resource="com/supersit/hibernate/mapping/Role.hbm.xml" />

</session-factory>

</hibernate-configuration>


映射文件:

Employee.hbm.xml
-----------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.supersit.hibernate.bean">
<class name="Employee" table="employee" schema="dbo"
catalog="hibernate">
<id name="eid" column="eid" type="int">
<generator class="identity"></generator>
</id>
<property name="ename" column="ename" type="string"
not-null="true">
</property>
<property name="join_date" column="join_date" type="date"></property>

<!-- 映射roles属性,和连接表emp_role进行关联,级联方式:保存更新,检索方式:立即检索 -->
<set name="roles" cascade="save-update" lazy="false"
table="emp_role">

<!-- 连接表的字段er_eid作为外键依赖于employee表的主键eid -->
<key column="er_eid"></key>
<!-- many-to-many属性建立和Role的多对多关联关系,class指定关联的持久化类,连接表的字段er_roleid作为外键依赖于role表的主键roleid -->
<many-to-many class="Role" column="er_roleid"></many-to-many>
</set>
</class>
</hibernate-mapping>


Role.hbm.xml
----------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.supersit.hibernate.bean">
<class name="Role" table="role" catalog="hibernate" schema="dbo">
<id name="roleid" column="roleid" type="int">
<generator class="identity"></generator>
</id>
<property name="rolename" column="rolename" type="string"
not-null="true">
</property>

<set name="emps" table="emp_role" cascade="save-update"
lazy="false" >
<key column="er_roleid"></key>
<many-to-many class="Employee" column="er_eid"></many-to-many>
</set>
</class>
</hibernate-mapping>


Dao
====================================


EmployeeDao.java
----------------------------------
package com.supersit.hibernate.dao;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.supersit.hibernate.bean.Employee;
import com.supersit.hibernate.bean.Role;
import com.supersit.hibernate.exception.HibernateMsgException;

public class EmployeeDao extends BaseDao {

/**
* <p>
* 查询所有的雇员
* </p>
*
* @author chenwei
* @return java.util.List
* @throws HibernateMsgException
*/
public java.util.List getEmps() throws HibernateMsgException {
java.util.List list = new java.util.ArrayList();
org.hibernate.Session session = null;
org.hibernate.Transaction tran = null;
try {
session = com.supersit.hibernate.factory.HibernateSessionFactory
.getSession();
tran = session.beginTransaction();
list = session.createQuery("from Employee e order by e.eid").list();

tran.commit();
} catch (Exception e) {
com.supersit.hibernate.factory.HibernateSessionFactory
.rollbackTran(tran);
} finally {
com.supersit.hibernate.factory.HibernateSessionFactory
.closeSession(session);
}
return list;
}

/**
* <p>
* 更改指定用户的角色
* </p>
*
* @author chenwei
* @param eid:用户ID
* @param roleids:角色ID数组
*
*/
public static void opeRolesOfEmp(Integer eid, String[] roleids)
throws HibernateMsgException {
org.hibernate.Session session = null;
org.hibernate.Transaction tran = null;
try {
session = com.supersit.hibernate.factory.HibernateSessionFactory
.getSession();
tran = session.beginTransaction();
Employee emp = (Employee) session.load(Employee.class, eid);
java.util.Set roles = new java.util.HashSet();
for (int i = 0; i < roleids.length; i++) {

// 查询角色(此处应传入一个Session对象,否则会抛出org.hibernate.NonUniqueObjectException)
Role role = new RoleDao().getRoleById(session, new Integer(
roleids[i]));
System.out.println("rolename=" + role.getRolename());
roles.add(role);
}
emp.setRoles(roles);
session.saveOrUpdate(emp);
tran.commit();
} catch (Exception e) {
e.printStackTrace();
com.supersit.hibernate.factory.HibernateSessionFactory
.rollbackTran(tran);
} finally {
com.supersit.hibernate.factory.HibernateSessionFactory
.closeSession(session);
}
}

public Employee initEmp(Employee emp) throws HibernateMsgException {
Session session = null;
Transaction tran = null;
try {
session = com.supersit.hibernate.factory.HibernateSessionFactory
.getSession();
tran = session.beginTransaction();
org.hibernate.Hibernate.initialize(emp.getRoles());
session.update(emp);
tran.commit();
} catch (Exception e) {
com.supersit.hibernate.factory.HibernateSessionFactory
.rollbackTran(tran);
} finally {
com.supersit.hibernate.factory.HibernateSessionFactory
.closeSession(session);
}
return emp;
}

public static void main(String[] args) throws HibernateMsgException {
// select();
opeRolesOfEmp(new Integer(1), new String[] { "1", "3", "4" });
}

// 检索
public static void select() throws HibernateMsgException {

EmployeeDao dao = new EmployeeDao();
List list = dao.getEmps();
for (int i = 0; i < list.size(); i++) {
Employee emp = (Employee) list.get(i);
System.out.println("eid=" + emp.getEid());
System.out.println("ename=" + emp.getEname());
System.out.println("join_date=" + emp.getJoin_date()); //
// 映射roles属性,lazy=false时,可以立即检索
Set roles = emp.getRoles();
java.util.Iterator ite = roles.iterator();
while (ite.hasNext()) {
Role role = (Role) ite.next();
System.out.println("rolename=" + role.getRolename());
}
System.out.println("===========================================");
}

}

// 保存对象
public static void insert() throws HibernateMsgException {

java.util.Date date = new java.util.Date();
java.text.SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
date = format.parse("2007-10-17");
} catch (ParseException e) {
e.printStackTrace();
}

Employee emp = new Employee(new Integer(1), "张信哲", date);

Session session = null;
Transaction tran = null;
try {
session = com.supersit.hibernate.factory.HibernateSessionFactory
.getSession();
tran = session.beginTransaction();
boolean b = new EmployeeDao().saveObj(session, emp);
if (b) {
System.out.println("成功保存一个Employee对象");
}
tran.commit();
} catch (Exception e) {
com.supersit.hibernate.factory.HibernateSessionFactory
.rollbackTran(tran);
} finally {
com.supersit.hibernate.factory.HibernateSessionFactory
.closeSession(session);
}

}

}


RoleDao.java
------------------------
package com.supersit.hibernate.dao;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.supersit.hibernate.bean.Employee;
import com.supersit.hibernate.bean.Role;
import com.supersit.hibernate.exception.HibernateMsgException;

public class RoleDao extends BaseDao {

/**
* <p>
* 根据角色ID查找角色(传入一个Session对象)
* </p>
*
* @param roleid:角色ID
* @return com.supersit.hibernate.bean.Role
* @throws HibernateMsgException
*/
public com.supersit.hibernate.bean.Role getRoleById(Session session,
Integer roleid) throws HibernateMsgException {
Role role = new Role();
try {
java.util.List list = session.createQuery(
"from Role r where r.roleid=:id").setInteger("id", roleid)
.list();
if (list != null && list.size() > 0)
role = (Role) list.get(0);

} catch (Exception e) {

}
return role;
}

/**
* <p>
* 根据角色ID查找角色(创建一个新的Session)
* </p>
*
* @param roleid:角色ID
* @return com.supersit.hibernate.bean.Role
* @throws HibernateMsgException
*/
public com.supersit.hibernate.bean.Role getRoleById(Integer roleid)
throws HibernateMsgException {
Role role = new Role();
Session session = null;
Transaction tran = null;
try {
session = com.supersit.hibernate.factory.HibernateSessionFactory
.getSession();
tran = session.beginTransaction();
java.util.List list = session.createQuery(
"from Role r where r.roleid=:id").setInteger("id", roleid)
.list();
if (list != null && list.size() > 0)
role = (Role) list.get(0);
tran.commit();
} catch (Exception e) {
com.supersit.hibernate.factory.HibernateSessionFactory
.rollbackTran(tran);
} finally {
com.supersit.hibernate.factory.HibernateSessionFactory
.closeSession(session);
}
return role;
}

public static void main(String[] args) throws HibernateMsgException {
selectEmpsOfEachRole();
}

/**
* <p>
* 查询所有的角色
* </p>
*
* @param session
* @return java.util.List
*/
public static java.util.List getAllRoles(org.hibernate.Session session) {
java.util.List list = new java.util.ArrayList();
list = session.createQuery("from Role r order by r.roleid asc").list();
return list;
}

public static void selectEmpsOfEachRole() throws HibernateMsgException {
org.hibernate.Session session = null;
org.hibernate.Transaction tran = null;
try {
session = com.supersit.hibernate.factory.HibernateSessionFactory
.getSession();
tran = session.beginTransaction();
java.util.List list = getAllRoles(session);

for (int i = 0; i < list.size(); i++) {
Role role = (Role) list.get(i);
System.out.println("角色编号:" + role.getRoleid());
System.out.println("角色名称:" + role.getRolename());
System.out.println("此角色下的所有雇员>>>");
java.util.Iterator ite = role.getEmps().iterator();
while (ite.hasNext()) {
Employee emp = (Employee) ite.next();
System.out.println("雇员编号:" + emp.getEid());
System.out.println("雇员姓名:" + emp.getEname());
System.out.println("入职时间:" + emp.getJoin_date());
}
System.out
.println("=======================================================");
}
tran.commit();

} catch (Exception e) {
com.supersit.hibernate.factory.HibernateSessionFactory
.rollbackTran(tran);
} finally {
com.supersit.hibernate.factory.HibernateSessionFactory
.closeSession(session);
}
}

}


/**
*
* <p>
* 对于持久化类的添加,删除,修改可以通过继承这个类来实现 如果已开启Session缓存,可以传入这个Session对象进行相应的操作,当然也可以
* 不调用此方法,直接调用Session对象相应的方法即可,在这里只是想实现面向接口编程
* 对于没有开启Session缓存的情况,直接调用只有一个参数的方法,在方法体中会自动创建 Session对象,进行相关操作...
* </p>
*
* @author chenwei
* 2007-10-26
*
*/
BaseDao.java
----------------------------
package com.supersit.hibernate.dao;

import org.hibernate.Session;

import com.supersit.hibernate.exception.HibernateMsgException;

public class BaseDao {

/**
* <p>
* 保存一个com.supersit.hibernate.Interface.ObjectIn对象
* </p>
*
* @author chenwei
* @param com.supersit.hibernate.Interface.ObjectIn
* @return boolean
* @throws HibernateMsgException
*/
public boolean saveObj(com.supersit.hibernate.Interface.ObjectIn in)
throws HibernateMsgException {

org.hibernate.Session ses = null;
org.hibernate.Transaction tran = null;
boolean flag = true;
try {
ses = com.supersit.hibernate.factory.HibernateSessionFactory1
.getSession();
tran = ses.beginTransaction();
ses.save(in);
tran.commit();
} catch (Exception e) {
e.printStackTrace();
flag = false;
com.supersit.hibernate.factory.HibernateSessionFactory
.rollbackTran(tran);
} finally {
com.supersit.hibernate.factory.HibernateSessionFactory
.closeSession(ses);
}
return flag;
}

/**
* <p>
* 保存一个com.supersit.hibernate.Interface.ObjectIn对象
* </p>
*
* @author chenwei
* @param com.supersit.hibernate.Interface.ObjectIn
* @return boolean
* @throws HibernateMsgException
*/
public boolean saveObj(Session session,
com.supersit.hibernate.Interface.ObjectIn in) {
boolean flag = true;
try {
session.save(in);
} catch (Exception e) {
e.printStackTrace();
flag = false;
}
return flag;
}

/**
* <p>
* 修改一个com.supersit.hibernate.Interface.ObjectIn对象
* </p>
*
* @author chenwei
* @param com.supersit.hibernate.Interface.ObjectIn
* @return boolean
* @throws HibernateMsgException
*/
public boolean updateObj(com.supersit.hibernate.Interface.ObjectIn in)
throws HibernateMsgException {
boolean flag = true;
org.hibernate.Session ses = null;
org.hibernate.Transaction tran = null;
try {
ses = com.supersit.hibernate.factory.HibernateSessionFactory
.getSession();
tran = ses.beginTransaction();
ses.update(in);
tran.commit();
} catch (Exception e) {
flag = false;
com.supersit.hibernate.factory.HibernateSessionFactory
.rollbackTran(tran);
} finally {
com.supersit.hibernate.factory.HibernateSessionFactory
.closeSession(ses);
}
return flag;
}

/**
* <p>
* 修改一个com.supersit.hibernate.Interface.ObjectIn对象
* </p>
*
* @author chenwei
* @param com.supersit.hibernate.Interface.ObjectIn
* @return boolean
* @throws HibernateMsgException
*/
public boolean updateObj(Session session,
com.supersit.hibernate.Interface.ObjectIn in) {
boolean flag = true;
try {
session.update(in);
} catch (Exception e) {
flag = false;
}
return flag;
}

/**
* <p>
* 删除一个com.supersit.hibernate.Interface.ObjectIn对象
* </p>
*
* @author chenwei
* @param com.supersit.hibernate.Interface.ObjectIn
* @return boolean
* @throws HibernateMsgException
*/

public boolean deleteObj(com.supersit.hibernate.Interface.ObjectIn in)
throws HibernateMsgException {
boolean flag = true;
org.hibernate.Session session = null;
org.hibernate.Transaction tran = null;
try {
session = com.supersit.hibernate.factory.HibernateSessionFactory
.getSession();
tran = session.beginTransaction();
session.delete(in);
tran.commit();
} catch (Exception e) {
flag = false;
com.supersit.hibernate.factory.HibernateSessionFactory
.rollbackTran(tran);
} finally {
com.supersit.hibernate.factory.HibernateSessionFactory
.closeSession(session);
}
return flag;
}

/**
* <p>
* 删除一个com.supersit.hibernate.Interface.ObjectIn对象
* </p>
*
* @author chenwei
* @param com.supersit.hibernate.Interface.ObjectIn
* @return boolean
* @throws HibernateMsgException
*/

public boolean deleteObj(Session session,
com.supersit.hibernate.Interface.ObjectIn in) {
boolean flag = true;
try {
session.delete(in);
} catch (Exception e) {
flag = false;
}
return flag;
}
}


ObjectIn.java
------------------------------

package com.supersit.hibernate.Interface;

public interface ObjectIn {

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值