文档章节

hibernate之映射关系一对多

闫帅龙
 闫帅龙
发布于 2017/05/11 20:02
字数 833
阅读 8
收藏 0

前序:一对多:是相对于一的一方看多一面,一的一方存放多方的多个对象,存储方式用集合存放
   对于配置有两个问题需要弄清楚:
    0、本文中的两个实体类
      UserClass.java:一个UserClass对象多个User对象
      User.java :一个User对像对应一个UserClass或不对应
      
    1、配置的各个属性:
      UserClass.bhm.xml的集合配置:
      
       name="users":指定UserClass对象中存放多个User对象集合的名称
       table="t_user":指定User对象所对应的表名称
       cascade=“all”:表示级联操作当前集合中的对象,如果存在update、不存在save、
       column="uc_id":指定当前指向多个User对象的外键字段
       class="com.wolf.pojo.oneToone.UserT":指向多的个对象的User类
        <set name="users" table="t_user" cascade="all" >
             <key column="uc_id"></key>
             <one-to-many class="com.wolf.pojo.oneToone.UserT"/>
            </set>
          User.bhm.xml的集合配置:
            其中两个就不介绍了
            column="u_uc_id":指定当前(本表或本类)外键的字段
        <many-to-one name="userclass" class="com.wolf.pojo.oneToone.UserClass"  column="u_uc_id" ></many-to-one>
       
     注意:<key column="u_uc_id"></key>和<many-to-one name="userclass" class="com.wolf.pojo.oneToone.UserClass"  column="u_uc_id" ></many-to-one>
        指向的都是多的一端字段(一对多)
    2、运行的详细说明
      1、如果程序一的一端,使用Set集合保存数据,如果继续添加数据只需获得集合直接add方法添加
          UserClass usercls=new UserClass();
          usercls.setId(UUID.randomUUID().toString());
          UserT user=new UserT();
          user.setId(UUID.randomUUID().toString());
          user.setName("user0");
          user.setAge(0);
          user.setPrice(0.1);
          user.setDatet(new Date());
          user.setUserclass(usercls);
          
          usercls.getUsers().add(user);//添加数据
      2、如果程序一的一端,使用Set集合保存数据,并且继续添加数据需要注意的一个地方,就是不能直接new Set集合否则,会将以前的数据刷掉(不代表删除,应用字段为null)
        UserClass usercls=(UserClass) session.get(UserClass.class, "2240f0af-7dc6-4701-ba22-9b3cbaf0b827");
        usercls.setUsers(new HashSet<UserT>());
        
      注意:如果继续添加采用1的方法,如果想从新添加可以使用2的方法,但是第二种方法会产生垃圾数据在数据库中(需定时删除为null的引用数据),
      
  代码:
   1、创建表:
   create table t_user(
     u_id varchar(255),
     u_name varchar(255),
     u_age Integer,
     u_price double(5,2),
     u_uc_id varchar(255),
     t_datet datetime,
     primary key(u_id)
    );
    
    create table t_user_class(
     uc_id varchar(255),
     uc_classNo Integer,
     uc_funds double(5,2),
     uc_back varchar(255),
     primary key(uc_id)
    );
   2、配置文件:
   UserClass.hbm.xml
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="com.wolf.pojo.oneToone">
        <class name="UserClass" table="t_user_class">
            <id name="id" column="uc_id"/>
            <property name="classNo" column="uc_classNo"/>
            <property name="funds" column="uc_funds"/>
            <property name="back" column="uc_back"/>
            <!-- inverse="true":关系维护由UserClass负责维护 -->
            <set name="users" table="t_user" cascade="all" >
             <key column="u_uc_id"></key>
             <one-to-many class="com.wolf.pojo.oneToone.UserT"/>
            </set>
        </class>
    </hibernate-mapping>
    
    User.hbm.xml
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="com.wolf.pojo.oneToone" auto-import="false">
        <class name="UserT" table="t_user">
        <!-- 多对一:只有单项    -->
            <id name="id" column="u_id">
            </id>
            <property name="name" column="u_name"/>
            <property name="datet" column="t_datet"/>
            <property name="age" column="u_age"/>
            <property name="price" column="u_price"/>
            <many-to-one name="userclass" class="com.wolf.pojo.oneToone.UserClass"  column="u_uc_id" ></many-to-one>
        </class>
    </hibernate-mapping>
   3、java类
    
    public class UserClass   implements Serializable{
     
     private  String id;
     private Integer classNo;
     private double funds;
     private String back;
     private Set<UserT> users=new HashSet<UserT>();
     此处略去get、set方法
    }
    
    public class UserT  implements Serializable{
    private String id;
    public String name;
    private Integer age;
    private double price;
    private Date datet;
    private UserClass userclass;
    
    此处略去get、set方法
    }
    
 4、测试代码:
     public class UtilMain {
    
     public static void main(String[] args) {
     
     Session session= HibernateSessionFactory.getSession();
     Transaction tr=session.beginTransaction();
     
   // UserClass usercls=(UserClass) session.get(UserClass.class, "2240f0af-7dc6-4701-ba22-9b3cbaf0b827");
   // usercls.setUsers(new HashSet<UserT>());
     
     UserClass usercls=new UserClass();
     usercls.setId(UUID.randomUUID().toString());
     UserT user=new UserT();
     user.setId(UUID.randomUUID().toString());
     user.setName("user0");
     user.setAge(0);
     user.setPrice(0.1);
     user.setDatet(new Date());
     user.setUserclass(usercls);
     usercls.getUsers().add(user);
     
     session.saveOrUpdate(usercls);
     tr.commit();
    }
   
   }
   
   
   
   

 

© 著作权归作者所有

闫帅龙
粉丝 5
博文 26
码字总数 14366
作品 0
闸北
程序员
私信 提问
Hibernate映射——一对多关联映射(七)

一对多关联映射 映射原理 一对多关联映射和多对一的关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,只是在写映射时发生了变化。 多对一和...

architect刘源源
2018/01/11
3
0
Java程序员从笨鸟到菜鸟之(五十四)细谈Hibernate(五)Hibernate一对多关系映射

前几篇系列博客: 细谈Hibernate(一)hibernate基本概念和体系结构 细谈Hibernate(二)开发第一个hibernate基本详解 细谈Hibernate(三)Hibernate常用API详解及源码分析 细谈Hibernate(四...

长平狐
2012/11/12
457
0
Java程序员从笨鸟到菜鸟之(五十六)细谈Hibernate(七)Hibernate自身一对多和多对多关系映射

欢迎阅读本专题其他博客: 细谈Hibernate(十)hibernate查询排序和组件映射 细谈Hibernate(十一)hibernate复合主键映射 细谈Hibernate(十二)hibernate查询排序组件映射 细谈Hibernate(...

长平狐
2012/11/12
261
0
Hibernate系列——总结篇(九)

概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我们也说它是数据持久层的框架。 我们从上一句话可以看出Hibernate的核心:面向对象、关系映射以及数据持久化。前面两个概念很容...

architect刘源源
2018/01/11
5
0
Hibernate之关联关系映射(一对多和多对一映射,多对多映射)

~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习一下框架了,不然又被忽悠让去培训。)~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射:   1.1:一对多和...

别叫小伙
2017/03/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linus 本尊来了!为什么 KubeCon 越来越火?

阿里妹导读: 从200人的小会议到3500 多位云原生和开源领域工程师齐聚一堂的大会,KubeCon 只用了四年,昨天,在KubeCon China 2019 上阿里巴巴宣布开源 OpenKruise,今天,Linus 本尊竟然现...

阿里云云栖社区
39分钟前
1
0
五小时构建云原生电商平台 | KubeCon SOFAStack Workshop 详解

本文根据 KubeCon China 2019 同场活动 SOFAStack Cloud Native Workshop 内容整理, 文末包含文档、PPT 地址,欢迎试用和提出建议。 2019 年 6 月 25 日,在 KubeCon China 2019,全球知名开...

SOFAStack
40分钟前
4
0
跨平台开发框架DevExtreme v19.1.4正式发布|附下载

DevExtreme Complete Subscription是性能最优的 HTML5,CSS 和 JavaScript 移动、Web开发框架,可以直接在Visual Studio集成开发环境,构建iOS,Android,Tizen和Windows Phone 8应用程序。D...

FILA6666
41分钟前
2
0
数据库链接断开 Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

报错信息如下: Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failureThe last packet successfully received from the server was 97,130 mill......

为了美好的明天
48分钟前
3
0
Flutter for Web 详细预研

背景 Google在最新的Google I/O上推出了Flutter for Web,旨在进一步解决一次代码,多端运行的问题。Flutter for Web还处于早期试验版,官方不建议在生产环境上使用。那么到底它的实际情况怎...

阿里云官方博客
50分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部