您的位置:首页 > 其它

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

2018-09-17 18:09 162 查看

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

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

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

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

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

User实体类

[code]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实体类

[code]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

[code]<?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

[code]<?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)

[code]<?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)进行级联的增删改查:

[code]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();
}

}

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: