多对多配置

发表时间:2017-05-17 17:28:23 浏览量( 34 ) 留言数( 0 )

学习目标:

1、搭建Hibernate环境

2、理解Hibernate的运行流程

3、能正确运行Hibernate的第一个例子


学习过程:

无可否认多对多的配置应该是最简单的,在数据库中多对多需要一个中间表,在hibernate中你可以使用多对多的标签配置这种关系,当然你也可以使用一对多的关系去维护也是可行的,这个就要看具体情况了,毕竟多对多也是依赖一对多的方式实现的。这节课我们就讲讲如何配置多对多,这种配置就让双方的表维护这种关系,在设计pojo类的时候就不需要为中间表专门设计一个对象。

1、修改pojo属性

在表设计中,帐号和角色之间就是多对多的关系,肯定需要使用集合来描述他们之间的关系,所有修改账号和角色两个pojo类,分别添加Set集合属性。

账号类如下:

public class Login implements java.io.Serializable {
	private Integer loginId;
	private Employee employee;// 一对一
	private String loginName;
	private String loginPass;
	
	private Set<Role> roles=new HashSet<Role>();//多对多	

角色类如下:

public class Role implements java.io.Serializable {

	private Integer roleId;
	private String roleName;
	private Set<Login> logins = new HashSet<Login>();//多对多	

2、修改映射文件

新建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.javadayup.stuormrelate.Role" table="role" catalog="hbm_db">
        <id name="roleId" type="java.lang.Integer">
            <column name="role_id" />
            <generator class="native" />
        </id>
        <property name="roleName" type="java.lang.String">
            <column name="role_name" length="200" />
        </property>
        
        
         <set name="logins" table="login_role" inverse="true">
          <key column="role_id"></key>
          <many-to-many column="login_id" class="com.javadayup.stuormrelate.Login"></many-to-many>
        </set>
       
    </class>
</hibernate-mapping>

修改Login.hbm.xml,添加一下代码

		<set name="roles" table="login_role" >
          <key column="login_id"></key>
          <many-to-many column="role_id" class="com.javadayup.stuormrelate.Role"></many-to-many>
        </set>

3、测试

public class Run3 {
	
	public static void main(String[] args) {
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		Login login=new Login();
		login.setLoginName("new");
		login.setLoginPass("123");
		
		Employee employee=new Employee();
		employee.setEmployeeId(8);
		
		login.setEmployee(employee);
		
		Set<Role> roles=new HashSet<Role>();
		
		Role role1=new Role();
		role1.setRoleId(1);
		
		Role role2=new Role();
		role2.setRoleId(2);
		
		roles.add(role2);
		roles.add(role1);
		
		login.setRoles(roles);
		

		
        // 开启一个事务
        session.beginTransaction();
 
        // 操作数据库 直接操作对象 持久化
        session.save(login);
 
        // 提交事物
        session.getTransaction().commit();
        
        session.close();
        
        HibernateUtil.getSessionFactory().close();
		
		
	}

}


虽然我们只是添加了一个Login信息,但是因为和员工和角色都已经有关系了,所以hibernate帮我们做了很多操作。包括中间包也已经帮我们建立了。查看一下输出的sql

Hibernate: create table hbm_db.role (role_id integer not null auto_increment, role_name varchar(200), primary key (role_id)) type=MyISAM

Hibernate: create table login_role (login_id integer not null, role_id integer not null, primary key (login_id, role_id)) type=MyISAM

Hibernate: alter table hbm_db.employee add constraint FKcm3b9d5fiw8s6co7lkw8c0lbs foreign key (post_id) references hbm_db.post (post_id)

Hibernate: alter table hbm_db.login add constraint FKrf9u9o9lttvq3jevsf6t8svp2 foreign key (employee_id) references hbm_db.employee (employee_id)

Hibernate: alter table login_role add constraint FK63kgx3alku7oht20p6r560u95 foreign key (role_id) references hbm_db.role (role_id)

Hibernate: alter table login_role add constraint FK9bqlp09e2a52fdq1ywjha2iti foreign key (login_id) references hbm_db.login (login_id)

Hibernate: insert into hbm_db.login (login_name, login_pass, employee_id) values (?, ?, ?)

Hibernate: insert into login_role (login_id, role_id) values (?, ?)

Hibernate: insert into login_role (login_id, role_id) values (?, ?)


我们再测试一下执行更新的操作。

public class Run4 {
	
	public static void main(String[] args) {
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		Login login=new Login();
		login.setLoginId(4);
		
		login.setLoginName("abcdef");
		login.setLoginPass("abc");
		
		Employee employee=new Employee();
		employee.setEmployeeId(8);
		
		login.setEmployee(employee);
		
		Set<Role> roles=new HashSet<Role>();
		
		Role role1=new Role();
		role1.setRoleId(1);
		roles.add(role1);
		
		login.setRoles(roles);
		
		
        // 开启一个事务
        session.beginTransaction();
 
        // 操作数据库 直接操作对象 持久化
        session.update(login);
 
        // 提交事物
        session.getTransaction().commit();
        
        session.close();
        
        HibernateUtil.getSessionFactory().close();
	}

}

Hibernate: update hbm_db.login set login_name=?, login_pass=?, employee_id=? where login_id=?

Hibernate: delete from login_role where login_id=?

Hibernate: insert into login_role (login_id, role_id) values (?, ?)

可以看到他会先执行一下delete,清空了所有的关系,然后再重新insert进去的。