1:多对多映射配置
以用户和角色为例
第一步:创建实体类,用户和角色
第二步:让两个实体类之间互相表示
(1)一个用户里面表示所有角色。使用set集合
(2) 一个角色有多个用户,使用set集合
User.java
package hibernate.manytomany;
import java.util.HashSet;
import java.util.Set;
public class User {
private Integer user_id;//用户id
private String user_name;//用户名称
private String user_password;//用户密码
private Set<Role> setuser=new HashSet<Role>();
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_password() {
return user_password;
}
public void setUser_password(String user_password) {
this.user_password = user_password;
}
public Set<Role> getSet() {
return setuser;
}
public void setSet(Set<Role> set) {
this.setuser = set;
}
}
Role.java
package hibernate.manytomany;
import java.util.HashSet;
import java.util.Set;
public class Role {
private Integer role_id;//角色id
private String role_name;//角色名称
private String role_description;//角色描述
private Set<User> setrole=new HashSet<User>();
public Integer getRole_id() {
return role_id;
}
public void setRole_id(Integer role_id) {
this.role_id = role_id;
}
public String getRole_name() {
return role_name;
}
public void setRole_name(String role_name) {
this.role_name = role_name;
}
public String getRole_description() {
return role_description;
}
public void setRole_description(String role_description) {
this.role_description = role_description;
}
public Set<User> getSet1() {
return setrole;
}
public void setSet1(Set<User> set1) {
this.setrole = set1;
}
}
第三步:配置映射关系
(1)基本配置
(2)配置多对多关系
- 在用户里面表示所有角色,使用set标签
- 在角色里面表示所有用户,使用set标签
role.hbm.xml部分代码片段
<!-- 在角色映射配置文件中,表示所有使用者 -->
<!--使用set标签表示所有角色 -->
<!--set标签里有name的属性,属性值写角色实体类里面表示使用者的set集合名称 -->
<!-- table属性是第三张表名称 -->
<!-- inverse属性默认值:false不放弃关系维护,true放弃关系维护 -->
<set name="setrole" cascade="save-update,delete" inverse="true" table="user_role">
<!-- key标签里面配置,配置当前映射文件在第三张表外键的名称-->
<key column="roleid"></key>
<!-- class属性值是角色实体类全路径 ,column属性值是第三张表外键名称-->
<many-to-many class="hibernate.manytomany.Role" column="roleid"/>
</set>
user.hbm.xml部分代码片段
<!-- 在使用者映射配置文件中,表示所有角色 -->
<!--使用set标签表示所有使用者 -->
<!--set标签里有name的属性,属性值写角色实体类里面表示联系人的set集合名称 -->
<!-- table属性是第三张表名称 -->
<!-- inverse属性默认值:false不放弃关系维护,true放弃关系维护 -->
<set name="setuser" cascade="save-update,delete" inverse="true" table="user_role">
<!-- key标签里面配置,配置当前映射文件在第三张表外键的名称-->
<key column="userid"></key>
<!-- class属性值是使用者实体类全路径 ,column属性值是第三张表外键名称-->
<many-to-many class="hibernate.manytomany.User" column="userid"/>
</set>
第四步:在核心配置文件中引入映射文件
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.url">jdbc:mysql:///mysql_studying</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">zlj18059008512</property>
<!-- 第二部分:配置Hibernate信息(可选的) -->
<!-- 输出底层sql语句-->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层sql语句格式 -->
<property name="hibernate.format_ sql">true</property>
<!-- Hibernate帮创建表,需要配置之后
updat:如果已有表,更新。没有,创建。
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库方言
让hibernate框架识别不同数据库的自己持有语句
-->
<property name="hibernate.dialect ">org.hibernate.dialect.MySQLDialect</property>
<!-- 在Hibernate核心配置文件中配置。目的为了绑定Session(保证单线程对象)
-->
<property name="hibernate.current_session_context_class">Thread</property>
<!-- 第三部分:把映射文件(.hbm.xml)放入到核心文件(.cfg.xml)中 (必须要写文件路径)-->
<mapping resource="hibernate/manytomany/role.hbm.xml"/>
<mapping resource="hibernate/manytomany/user.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2:多对多级联保存(重点)
问题:根据用户保存角色
第一步:在用户配置文件中,使用set标签里的cascade属性进行配置,cascade="save-update"
user.hbm.xml部分代码片段
<set name="setuser" cascade="save-update" table="user_role">
第二步:写代码实现
(1)创建用户和角色对象。把角色收到用户里面。最终保存用户就可以了。
@Test
//演示多对多操作(级联保存)
public void testSave() {
Configuration configuration=new Configuration();
SessionFactory sessionFactory=null;
Session session=null;
Transaction transaction=null;
try {
configuration.configure();
sessionFactory=HibernateUtilities.getSessionFactory();
session=HibernateUtilities.getSessionObject();
transaction=session.beginTransaction();
//添加两个用户,为每个用户添加两个角色
//1:创建对象
User user1=new User();
User user2=new User();
user1.setUser_id(1);
user1.setUser_name("zlj");
user1.setUser_password("123456");
user2.setUser_id(2);
user2.setUser_name("zl");
user2.setUser_password("12345");
Role role1=new Role();
Role role2=new Role();
Role role3=new Role();
role1.setRole_id(1);
role1.setRole_description("开车");
role1.setRole_name("司机");
role2.setRole_id(2);
role2.setRole_description("打扫");
role2.setRole_name("保洁");
role3.setRole_id(3);
role3.setRole_description("保卫");
role3.setRole_name("保安");
//2:建立关系把角色放到用户里
user1.getSet().add(role1);
user1.getSet().add(role2);
user2.getSet().add(role3);
user2.getSet().add(role2);
//3:保存用户
session.save(user2);
session.save(user1);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}finally {
session.close();
sessionFactory.close();
}
}
3:多对多级删除
//演示多对多操作(级联删除)
public void testDelete() {
Configuration configuration=new Configuration();
SessionFactory sessionFactory=null;
Session session=null;
Transaction transaction=null;
try {
configuration.configure();
sessionFactory=HibernateUtilities.getSessionFactory();
session=HibernateUtilities.getSessionObject();
transaction=session.beginTransaction();
User user=session.get(User.class, 1);
session.delete(user);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}finally {
session.close();
sessionFactory.close();
}
}
4:维护第三张表
//演示多对多操作(维护第三张表)
public void testMaintain() {
Configuration configuration=new Configuration();
SessionFactory sessionFactory=null;
Session session=null;
Transaction transaction=null;
try {
configuration.configure();
sessionFactory=HibernateUtilities.getSessionFactory();
session=HibernateUtilities.getSessionObject();
transaction=session.beginTransaction();
//演示让某个用户拥有某个角色
//1:查询指定用户和角色
User user=session.get(User.class, 1);
Role role=session.get(Role.class, 1);
//2:把角色放到指定用户里
user.getSet().add(role);
/**演示让某个用户不拥有某个角色
//1:查询指定用户和角色
User user=session.get(User.class, 1);
Role role=session.get(Role.class, 1);
//2:把角色放到指定用户里,然后移除
user.getSet().remove(role);*/
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}finally {
session.close();
sessionFactory.close();
}
}