java鬼混笔记:Hibernate:5、多对多关联、多对多拆份两个一对多

这次的学习笔记是 hibernate的多对多关系设置,后面拆分成两个一对多。多对多常见到不能常见的是用户和角色的关系啦。。。项目都有用到,特别是统一身份认证系统(刚从学校出来做过统一身份认证时,有点无聊)。 一个用户可能有多个角色,比如学校的小明可以是普通学生,也可以是学生会组长,学生会组长也会是别人,普通学生角色别的同学也会有。总的来说,普通学生的角色中包含一群学生,一个学生也可能 有多个角色。不说了,直拉上代码,基本的多对多代码。


user.java

package com.ywj.TestHibernate.e;

import java.io.Serializable;
import java.util.Set;

public class User implements Serializable {

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

	private Long id;
	private String name;
	private Set<Role> role;// 多个角色
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<Role> getRole() {
		return role;
	}
	public void setRole(Set<Role> role) {
		this.role = role;
	}
}


User.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.ywj.TestHibernate.e">
	<class name="User" table="User">

		<id name="id" column="id" type="java.lang.Long">
			<generator class="identity" />
		</id>

		<property name="name" />

		<set name="role" table="userRole" inverse="true"><!-- inverse="true":由角色来控制关系,table="userRole":会生成一个中间表userRole -->
			<key column="userId"></key><!-- 多对多会生成一张中间表,有个字段userId,对就的是user表的ID -->
			<many-to-many class="Role" column="roleId"></many-to-many><!-- 多对多user怎么找到相关的role的?就是根据中间表userRole的userId来找到相对应的roleId的再来找到role -->
		</set>
	</class>
</hibernate-mapping>

Role.java

package com.ywj.TestHibernate.e;

import java.io.Serializable;
import java.util.Set;

public class Role implements Serializable {

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

	private Long id;
	private String name;
	private Set<User> user;// 多个用户
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<User> getUser() {
		return user;
	}
	public void setUser(Set<User> user) {
		this.user = user;
	}
}

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.ywj.TestHibernate.e">
	<class name="Role" table="role">

		<id name="id" column="id" type="java.lang.Long">
			<generator class="identity" />
		</id>
		<property name="name" />
		<set name="user" table="userRole" inverse="false"><!-- 生成中间表userRole,inverse="false":角色来管理关系  -->
			<key column="roleId"></key><!-- 多对多会生成一张中间表,有个字段roleId,对就的是role表的ID -->
			<many-to-many class="User" column="userId"></many-to-many><!-- 多对多Role怎么找到相关的user的?就是根据中间表userRole的roleId来找到相对应的userId的来找到相关的user -->
		</set>
	</class>
</hibernate-mapping>

Test.java

package com.ywj.TestHibernate.test;

import java.util.HashSet;
import java.util.Set;

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

import com.ywj.TestHibernate.e.User;
import com.ywj.TestHibernate.e.Role;


public class Test {

	public static void main(String[] args) {
		
		Session s = HibernateUtils.getCurrentSession();
		Transaction t  = null;
		
		try {
			
			t = s.beginTransaction();
			
			User u = new User();
			u.setName("u5");
			
			User u2 = new User();
			u2.setName("u6");
			
			Role r = new Role();
			r.setName("r5");
			
			Role r2 = new Role();
			r2.setName("r6");
			
			Set<User> uSet = new HashSet<User>();
			uSet.add(u);
			uSet.add(u2);
			
			r.setUser(uSet);
			r2.setUser(uSet);
			
			s.save(u);
			s.save(u2);
			s.save(r);
			s.save(r2);
			
			
			t.commit();
			// 查询
			/*Role role = (Role) s.load(Role.class, 1L);
			Set<User> users = role.getUser();
			for(User u : users) {
				System.out.println(u.getId()+":"+u.getName());
			}*/
			
			
			//查询
			/*User u = (User) s.load(User.class, 1L);
			Set<Role> roles = u.getRole();
			for(Role r : roles) {
				System.out.println(r.getId()+":"+r.getName());
			}*/
			
		} catch (Exception e) {
			e.printStackTrace();
			t.rollback();
		} finally {
			s.close();
		}
		
	}

}

OK,,,完毕。

接下来把多对多拆分成一对多,拆分不般是hIibernate自动生成的 中间表字段不够用,不适合自定义字段,所以我们自己定义一个中间表UserRole.,要什么字段自己来(要什么菜自己挟), 上代码。。。


User.java

package com.ywj.TestHibernate.e;

import java.io.Serializable;
import java.util.Set;

public class User implements Serializable {

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

	private Long id;
	private String name;
	private Set<UserRole> userRole;

	public User() {}
	
	public User(String name) {
		this.name = name;
	}
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<UserRole> getUserRole() {
		return userRole;
	}

	public void setUserRole(Set<UserRole> userRole) {
		this.userRole = userRole;
	}

}

User.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.ywj.TestHibernate.e">
	<class name="User" table="User">

		<id name="id" column="id" type="java.lang.Long">
			<generator class="identity" />
		</id>

		<property name="name" />

		<set name="userRole" inverse="true">  
            <key column="user"></key>
            <one-to-many class="UserRole"/>  
        </set> 
	</class>
</hibernate-mapping>

Role.java

package com.ywj.TestHibernate.e;

import java.io.Serializable;
import java.util.Set;

public class Role implements Serializable {

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

	private Long id;
	private String name;
	private Set<UserRole> userRole;

	public Role() {}
	
	public Role(String name) {
		this.name = name;
	}
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<UserRole> getUserRole() {
		return userRole;
	}

	public void setUserRole(Set<UserRole> userRole) {
		this.userRole = userRole;
	}

}

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.ywj.TestHibernate.e">
	<class name="Role" table="role">

		<id name="id" column="id" type="java.lang.Long">
			<generator class="identity" />
		</id>
		<property name="name" />
		<set name="userRole" inverse="true">  
            <key column="role"></key>
            <one-to-many class="UserRole"/>  
        </set> 
	</class>
</hibernate-mapping>

UserRole.java

package com.ywj.TestHibernate.e;

import java.io.Serializable;
import java.util.Date;

public class UserRole implements Serializable {

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

	private Long id;
	private Date date;// 授权时间 ,有问题可以根据时间来查
	private User user;
	private Role role;

	public UserRole(User user, Role role) {
		this.user = user;
		this.role = role;
		this.date = new Date();
	}
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public Role getRole() {
		return role;
	}

	public void setRole(Role role) {
		this.role = role;
	}
}

UserRole.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.ywj.TestHibernate.e">
	<class name="UserRole" table="UserRole">

		<id name="id" column="id" type="java.lang.Long">
			<generator class="identity" />
		</id>

		<property name="date" column="date" type="java.util.Date"/>
		
		<many-to-one name="user" column="user" class="User"></many-to-one>
		<many-to-one name="role" column="role" class="Role"></many-to-one>
	</class>
</hibernate-mapping>

Test.java

package com.ywj.TestHibernate.test;

import java.util.Set;

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

import com.ywj.TestHibernate.e.User;
import com.ywj.TestHibernate.e.UserRole;

public class Test {

	public static void main(String[] args) {

		Session s = HibernateUtils.getCurrentSession();
		Transaction t = null;

		try {
		/*
			 * t = s.beginTransaction();
			 * 
			 * User u1 = new User("u1");
			 * 
			 * User u2 = new User("u2");
			 * 
			 * 
			 * 
			 * 
			 * Role r1 = new Role("r1");
			 * 
			 * 
			 * 
			 * 
			 * Role r2 = new Role("r2");
			 * 
			 * 
			 * 
			 * 
			 * UserRole ur1 = new UserRole(u1,r1);
			 * 
			 * UserRole ur2 = new UserRole(u1,r2);
			 * 
			 * 
			 * 
			 * 
			 * UserRole ur3 = new UserRole(u2,r1);
			 * 
			 * 
			 * 
			 * 
			 * UserRole ur4 = new UserRole(u2,r2);
			 * 
			 * 
			 * 
			 * 
			 * 
			 * s.save(u1); s.save(u2); s.save(r1); s.save(r2); s.save(ur1); s.save(ur2);
			 * s.save(ur3); s.save(ur4);
			 * 
			 * 
			 * t.commit();
			 */
			// 查询
			User u = (User) s.load(User.class, 3L);
			Set<UserRole> urs = u.getUserRole();
			for (UserRole ur : urs) {
				System.out.println(ur.getDate() + ":" + ur.getRole().getName());
			}

		} catch (Exception e) {
			e.printStackTrace();
			t.rollback();
		} finally {
			s.close();
		}

	}

}


ok...

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值