Hibernate的关系映射——Many-To-Many(多对多)

多对多:多对多的关系至少需要三张表,两张关系表,一张中间表,用来保存两个表之间的关系。

用一个例子来表明多对多的关系:用户、角色以及用户角色。

实际应用中:一个用户可能会有多个角色,而一个角色也会有多个用户,而用户角色则是保存两个表之间关系的一个中间表。

在数据库创建三个表user、role、userrole

首先创建两个实体类,作为中间表的userrole是不用创建实体类的

User实体类

public class User {

	private String uid;
	private String uname;

	private transient Set<Role> sr = new HashSet<>();

	public Set<Role> getSr() {
		return sr;
	}

	public void setSr(Set<Role> sr) {
		this.sr = sr;
	}

	public User() {
		super();
		// TODO Auto-generated constructor stub
	}

	public User(String uid, String uname) {
		super();
		this.uid = uid;
		this.uname = uname;
	}

	public String getUid() {
		return uid;
	}

	public void setUid(String uid) {
		this.uid = uid;
	}

	public String getUname() {
		return uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

}

Role实体类

public class Role {

	private String rid;
	private String rname;

	private transient Set<User> su = new HashSet<>();

	public Set<User> getSu() {
		return su;
	}

	public void setSu(Set<User> su) {
		this.su = su;
	}

	public Role() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Role(String rid, String rname) {
		super();
		this.rid = rid;
		this.rname = rname;
	}

	public String getRid() {
		return rid;
	}

	public void setRid(String rid) {
		this.rid = rid;
	}

	public String getRname() {
		return rname;
	}

	public void setRname(String rname) {
		this.rname = rname;
	}

}

然后创建两个实体类的映射文件

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">
<!-- Generated 2018-9-11 11:29:40 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
	<class name="com.zking.pojo.User" table="USER">
		<id name="uid" type="java.lang.String">
			<column name="UID" />
			<generator class="guid" />
		</id>
		<property name="uname" type="java.lang.String">
			<column name="UNAME" />
		</property>

		<set name="sr" table="userrole" inverse="true" cascade="save-update">
			<key column="uid"></key>
			<many-to-many class="com.zking.pojo.Role" column="rid"></many-to-many>
		</set>

	</class>
</hibernate-mapping>

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">
<!-- Generated 2018-9-11 11:29:40 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
	<class name="com.zking.pojo.Role" table="ROLE">
		<id name="rid" type="java.lang.String">
			<column name="RID" />
			<generator class="guid" />
		</id>
		<property name="rname" type="java.lang.String">
			<column name="RNAME" />
		</property>

		<set name="su" table="userrole" >
			<key column="rid"></key>
			<many-to-many class="com.zking.pojo.User" column="uid"></many-to-many>
		</set>

	</class>
</hibernate-mapping>

生成一个唯一的Hibernate映射文件(hibernate.cfg.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.password">sasa</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/t204?characterEncoding=UTF-8</property>
		<property name="hibernate.connection.username">root</property>

		<property name="show_sql">true</property>

		<property name="format_sql">true</property>

		<mapping resource="com/zking/pojo/User.hbm.xml" />

		<mapping resource="com/zking/pojo/Role.hbm.xml" />
	</session-factory>
</hibernate-configuration>

大体的创建如下:

最后写一个测试的类(MToM.java)进行级联的增删改查:

public class MToM {

	@Test
	public void add() {
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		User u1 = new User();
		u1.setUname("admin");

		Role r1 = new Role();
		r1.setRname("System_Admin");
		Role r2 = new Role();
		r2.setRname("Admin");

		u1.getSr().add(r1);
		u1.getSr().add(r2);
		r1.getSu().add(u1);
		r2.getSu().add(u1);

		session.save(u1);

		transaction.commit();
		session.close();
		sessionFactory.close();
	}

	@Test
	public void query() {
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();

		User u1 = session.get(User.class, "647abe95-b575-11e8-bcfa-88d7f6a16255");
		String str = JSON.toJSONString(u1);
		System.out.println(str);

		session.close();
		sessionFactory.close();
	}

	@Test
	public void update() {
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		User u1 = session.find(User.class, "647abe95-b575-11e8-bcfa-88d7f6a16255");
		u1.setUname("user");
		session.saveOrUpdate(u1);

		transaction.commit();
		session.close();
		sessionFactory.close();
	}

	@Test
	public void delete() {
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		User u1 = session.find(User.class, "7669c201-b5a9-11e8-bcfa-88d7f6a16255");
		Set<Role> sr = u1.getSr();
		for (Role role : sr) {
			role.getSu().remove(u1);
		}

		transaction.commit();
		session.close();
		sessionFactory.close();
	}

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值