Hibernate多对多操作

多对多映射配置

以用户和角色为例演示

第一步 创建实体类,用户和角色

第二步 让两个实体类之间互相表示

(1)一个用户里面表示所有角色,使用set集合

具体:

User.java

public class User {
private Integer user_id;//用户id
private String user_name;//用户名称
private String user_password;//用户密码
//一个用户可以有多个角色
private Set<Role> setRole = new HashSet<Role>();
public Set<Role> getSetRole() {
return setRole;
}
public void setSetRole(Set<Role> setRole) {
this.setRole = setRole;
}
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;
}
}

(2)一个角色有多个用户,使用set集合

具体:

Role.java

public class Role {
private Integer role_id;//角色id
private String role_name;//角色名称
private String role_memo;//角色描述
// 一个角色有多个用户
private Set<User> setUser = new HashSet<User>();
public Set<User> getSetUser() {
return setUser;
}
public void setSetUser(Set<User> setUser) {
this.setUser = setUser;
}
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_memo() {
return role_memo;
}
public void setRole_memo(String role_memo) {
this.role_memo = role_memo;
}
}

第三步 配置映射关系

(1)基本配置

User.hbm.xml

<hibernate-mapping>
<!-- 1 配置类和表对应
class标签
name属性:实体类全路径
table属性:数据库表名称
-->
<class name="cn.itcast.manytomany.User" table="t_user">
<id name="user_id" column="user_id">
<generator class="native"></generator>
</id>
<property name="user_name" column="user_name"></property>
<property name="user_password" column="user_password"></property>
</class>
</hibernate-mapping>

Role.hbm,xml

<hibernate-mapping>
<!-- 1 配置类和表对应
class标签
name属性:实体类全路径
table属性:数据库表名称
-->
<class name="cn.itcast.manytomany.Role" table="t_role">
<id name="role_id" column="role_id">
<generator class="native"></generator>
</id>
<property name="role_name" column="role_name"></property>
<property name="role_memo" column="role_memo"></property>
</class>
</hibernate-mapping>

(2)配置多对多关系

- 在用户里面表示所有角色,使用set标签

User,hbm.xml

- 在角色里面表示所有用户,使用set标签

Role.hbm.xml

第四步 在核心配置文件中引入映射文件

测试:

运行测试类

public class HibernateUtils {
static Configuration cfg = null;
static SessionFactory sessionFactory = null;
//静态代码块实现
static {
//加载核心配置文件
cfg = new Configuration().configure();
sessionFactory = cfg.buildSessionFactory();
}
//提供返回与本地线程绑定的session方法
public static Session getSessionObject() {
return sessionFactory.getCurrentSession();
}
// 提供方法返回sessionFactory
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void main(String[] args) {
}
}

多对多级联保存

根据用户保存角色

第一步 在用户配置文件中set标签进行配置,cascade值save-update,就不用另外保存角色了

第二步 写代码实现

(1)创建用户和角色对象,把角色放到用户里面,最终保存用户就可以了

public class HibernateManytoMany {
//演示多对多级联保存
@Test
public void testSave() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try{
sessionFactory = HibernateUtils.getSessionFactory();
//与本地线程绑定的session
session = sessionFactory.openSession();
//开启事务
tx = session.beginTransaction();
//1 添加两个用户,为每个用户添加两个角色
User user1 = new User();
user1.setUser_name("mary");
user1.setUser_password("123");
User user2 = new User();
user2.setUser_name("lucy");
user2.setUser_password("456");
Role r1 = new Role();
r1.setRole_name("总经理");
r1.setRole_memo("总经理");
Role r2 = new Role();
r2.setRole_name("秘书");
r2.setRole_memo("秘书");
Role r3 = new Role();
r3.setRole_name("保安");
r3.setRole_memo("保安");
//2 建立关系,把角色放到用户里面
// user1--r1/r2,// user2--r2/r3
user1.getSetRole().add(r1);
user1.getSetRole().add(r2);
user2.getSetRole().add(r2);
user2.getSetRole().add(r3);
//3 保存用户
session.save(user1);
session.save(user2);
//提交事务
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
session.close();
sessionFactory.close();
}
}
}

多对多级联删除(了解)

第一步 在set标签进行配置,cascade值delete

第二步 删除用户

维护第三张表关系

1 用户和角色多对多关系,维护关系通过第三张表维护

2 让某个用户有某个角色

第一步 根据id查询用户和角色

第二步 把角色放到用户里面

(1)把角色对象放到用户set集合

3 让某个用户没有某个角色

第一步 根据id查询用户和角色

第二步 从用户里面把角色去掉

(1)从set集合里面把角色移除

Hibernate_day03--Hibernate多对多操作的更多相关文章

  1. Hibernate多对多操作

    ---------------------siwuxie095 Hibernate 多对多操作 以用户和角色为例 (一)多对多映射配置 第一步:创建两个实体类,用户和角色 第二步:让两个实体类之间互相 ...

  2. hibernate 多对多操作(级联操作)

    一.级联保存 分别在用户和角色配置文件中在set标签中加入cascade="save-update": 示例:添加同时添加用户对象和角色对象并关联两个对象: 只需将角色放入用户对象 ...

  3. hibernate多对一的操作解析

    在hibernate的关联操作中有很多关系,其中多对一关系是最常见的.我们看这两个表. 这里有部门表和员工表. 那么我们可以这么说一个部门可以有多个员工.这就是1对多的关系.这是我们站在部门表的角度上 ...

  4. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  5. hibernate多对一双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  6. hibernate多对一单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  7. hibernate 多对多

    HibernateHibernate多对多关联映射通常别拆分成两个多对一关联映射1. 下面的HostBean.UserBean.UserHostBean,UserHostBean是两个表之间的关联表, ...

  8. hibernate 多对多 最佳实践

    首先 看看我们 ER 画画 :盖  一对一 .一对多 .多对多 的关系 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem91dG9uZ3l1YW4=/fo ...

  9. hibernate多对多的更新问题

    错误原因 A different ]; nested exception ]] with root cause org.hibernate.NonUniqueObjectException: A di ...

随机推荐

  1. 【微信小程序】request请求POST提交数据,记得要加上header

    wx.request({ url: '*******', data: { "type":"nearest_village", "district&qu ...

  2. 数据库字符集与排序规则(Character Set And Collation)

    数据库需要适应各种语言和字符就需要支持不同的字符集(Character Set),每种字符集也有各自的排序规则(Collation). (注意:Collation原意为校对,校勘,但是根据实际使用场景 ...

  3. Hive面试题——累计求和

    需求: 有如下访客访问次数统计表 t_access_times 访客 月份 访问次数 A 2015-01 5 A 2015-01 15 B 2015-01 5 A 2015-01 8 B 2015-0 ...

  4. zookeeper集群的搭建

    虚拟机为VirtualBox 4.3.12版本:系统为CentOS 6.6版本:zookeeper 3.4.7:java版本1.7.0_67. 虚拟机设置为桥接网卡,这样就可以通过主机网卡上网了.Vi ...

  5. OAuth 授权timestamp refused问题

         400 timestamp_refused /oauth/request_token           两台机器161.155      两机器代码完全一致,但155部署时,启动需要OAu ...

  6. Ubuntu中建立ftp 503错误解决办法

    The problem is because your folder is owned by root, instead of ftpuser. To fix it run: sudo chown - ...

  7. Atitit.c# .net 3.5 4.0 4.5 5.0 6.0各个版本新特性战略规划总结

    Atitit.c# .net 3.5 4.0 各个版本新特性战略规划总结 1. --------------.Net Framework版本同CLR版本的关系1 2. paip.----------- ...

  8. cxf动态调用webservice设置超时,测试线程安全

    Java代码 import java.util.Random; import java.util.concurrent.ArrayBlockingQueue; import java.util.con ...

  9. oracle锁表,杀死进程

    查询锁表数据 select object_name,machine,s.sid,s.serial#from v$locked_object l,dba_objects o ,v$session swh ...

  10. jsp error-page没有生效

    1.首页检查web.xml中的配置,确保路径是正确的 <error-page> <error-code>404</error-code> <location& ...