当前位置: 首页 > news >正文

在Hibernate中配置多对多连接表

接前文 在Hibernate中配置一对多连接表

其中表roomusers更改如下:
create   table  ROOMUSERS(
       USERID 
NUMBER ( 4 ),
       ROOMID 
NUMBER ( 4 not   null
);

映射文件配置如下:
Room.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"
>
<!--  
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
< hibernate-mapping  package ="com.cosmow.hibernatedemo2.entity" >
    
< class  name ="Room"  table ="ROOM"  schema ="STORE" >
        
< id  name ="id"  type ="java.lang.Long" >
            
< column  name ="ID"  precision ="4"  scale ="0"   />
            
<!--  Oracle数据库增长方式序列  -->
            
< generator  class ="sequence" >
                
< param  name ="sequence" > ROOM_SEQ </ param >
            
</ generator >
        
</ id >
        
<!--  映射roomnumber属性  -->
        
< property  name ="roomnumber"  type ="java.lang.String" >
            
< column  name ="ROOMNUMBER"  length ="11"  not-null ="true"   />
        
</ property >
        
<!--  映射name属性  -->
        
< property  name ="name"  type ="java.lang.String" >
            
< column  name ="NAME"  length ="32"  not-null ="true"   />
        
</ property >
        
<!--  通过连接表的多端,因此需要table属性为roomusers  -->
        
< set  name ="users"  cascade ="all"  table ="roomusers" >
            
<!--  该key的字段为连接表中的字段,作为外键  -->
            
< key  column ="roomid"   />
            
<!--  配置多对多  -->
            
< many-to-many  class ="Userinfo"  column ="userid"   />
        
</ set >
    
</ class >
</ hibernate-mapping >

Userinfo.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"
>
<!--  
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
< hibernate-mapping  package ="com.cosmow.hibernatedemo2.entity" >
    
< class  name ="Userinfo"  table ="USERINFO"  schema ="STORE" >
        
< id  name ="id"  type ="java.lang.Long" >
            
< column  name ="ID"  precision ="4"  scale ="0"   />
            
<!--  Oracle数据库增长方式序列  -->
            
< generator  class ="sequence" >
                
< param  name ="sequence" > USERINFO_SEQ </ param >
            
</ generator >
        
</ id >
        
< property  name ="name"  type ="java.lang.String" >
            
< column  name ="NAME"  length ="32"  not-null ="true"   />
        
</ property >
        
< property  name ="sex"  type ="java.lang.String" >
            
< column  name ="SEX"  length ="2"   />
        
</ property >
        
< set  name ="rooms"  cascade ="all"  table ="roomusers" >
            
< key  column ="userid"   />
            
< many-to-many  class ="Room"  column ="roomid"   />
        
</ set >
    
</ class >
</ hibernate-mapping >

测试代码如下:
/** */ /**
 * Demo.java
 *
 * Copyright 2008. All Rights Reserved.
 
*/

package  com.cosmow.hibernatedemo2.demo;

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

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

import  com.cosmow.HibernateSessionFactory;
import  com.cosmow.hibernatedemo2.entity.Room;
import  com.cosmow.hibernatedemo2.entity.Userinfo;

/** */ /**
 * TODO
 * 
 * Revision History
 *
 * 2008-7-11,Cosmo,created it
 
*/

public   class  Demo  {
    
    
public void test() 
        
//第一个room实体
        Room room = new Room();
        room.setName(
"cosmoHome");
        room.setRoomnumber(
"001");
        
        
//第二个room实体
        Room room2 = new Room();
        room2.setName(
"Home2");
        room2.setRoomnumber(
"002");

        
//第一个user实体
        Userinfo user = new Userinfo();
        user.setName(
"cosmo");
        user.setSex(
"M");
        
        
//第二个user实体
        Userinfo user2 = new Userinfo();
        user2.setName(
"winnie");
        user2.setSex(
"F");

        
//创建第二个user实体与第二个room实体的关系,通过连接表维护关系
        Set<Room> roomSet = new HashSet<Room>();
        roomSet.add(room2);
        user2.setRooms(roomSet);
        
        
//创建第一个room实体与第一、第二个user实体的关系,通过连接表维护关系
        
//添加user实体到集合userSet
        Set<Userinfo> userSet = new HashSet<Userinfo>();
        userSet.add(user);
        userSet.add(user2);
        room.setUsers(userSet);

        
// 启动Session
        Session session = HibernateSessionFactory.getSession();
        
// 启动事务
        Transaction tx = session.beginTransaction();
        
// 持久化room实体
        
//此时将更新表room和userinfo以及维护关系的roomusers表
        session.save(room);
        tx.commit();
        HibernateSessionFactory.closeSession();
        
        
// 启动Session
        session = HibernateSessionFactory.getSession();
        
// 启动事务
        tx = session.beginTransaction();
        
        
//获取Room实体以成为持久化状态,此时将获取room表的所有字段信息
        Room roomF1 = (Room)session.get(Room.class, room.getId());
        
        
//通过外连接roomusers获取userinfo表对应字段信息
        Iterator<Userinfo> iF1 = roomF1.getUsers().iterator();
        
while(iF1.hasNext()) 
            Userinfo userF 
= iF1.next();
            System.out.println(userF.getId());
            System.out.println(userF.getName());
            System.out.println(userF.getSex());
        }

        
        Room roomF2 
= (Room)session.get(Room.class, room2.getId());
        
        Iterator
<Userinfo> iF2 = roomF2.getUsers().iterator();
        
while(iF1.hasNext()) 
            Userinfo userF 
= iF2.next();
            System.out.println(userF.getId());
            System.out.println(userF.getName());
            System.out.println(userF.getSex());
        }

        
        tx.commit();
        HibernateSessionFactory.closeSession();
    }


    
public static void main(String[] args) {
        Demo demo 
= new Demo();
        demo.test();
    }


}

相关文章:

  • ionic2 自定义cordova插件开发以及使用 (Android)
  • 语录十八
  • 什么样的_BUG_会让你目瞪口呆?
  • C#编程利器之二:结构与枚举(Structure and enumeration)
  • 基础搜索算法的常见题型
  • Memcache安装详解
  • Adobe Premiere-DV采集视频格式常识
  • 5年运维经验分享:一个小白走向高级运维工程师之路
  • 举例介绍活动目录的优势
  • JMXtrans + InfluxDB + Grafana实现Kafka性能指标监控
  • Javascript 控制 Flash FLV视频播放器 --国外开源
  • PHP小知识
  • 海量计算机入门视频教程
  • Essential Studio for JavaScript发布2017 v2,扩展企业Web开发界限
  • 工具类:DateUtils类提供日期的处理方法
  • @jsonView过滤属性
  • [笔记] php常见简单功能及函数
  • 【笔记】你不知道的JS读书笔记——Promise
  • 2017-09-12 前端日报
  • happypack两次报错的问题
  • HTTP中GET与POST的区别 99%的错误认识
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • passportjs 源码分析
  • vue-router 实现分析
  • 产品三维模型在线预览
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 机器学习学习笔记一
  • 记录:CentOS7.2配置LNMP环境记录
  • 一份游戏开发学习路线
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​MySQL主从复制一致性检测
  • ​queue --- 一个同步的队列类​
  • #数学建模# 线性规划问题的Matlab求解
  • (4)Elastix图像配准:3D图像
  • (a /b)*c的值
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)计算机毕业设计ssm电影分享网站
  • (五)MySQL的备份及恢复
  • (转) 深度模型优化性能 调参
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET开发者必备的11款免费工具
  • .net中的Queue和Stack
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [04] Android逐帧动画(一)
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [20170728]oracle保留字.txt
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [AIGC] Redis基础命令集详细介绍
  • [Android]通过PhoneLookup读取所有电话号码
  • [Angular 基础] - 数据绑定(databinding)
  • [AutoSAR 存储] 汽车智能座舱的存储需求