注意事项:

1.单向一对多
   只需在“一”放进行配置
2.双向一对多
   需要在关联双方都加以配置,而且需要在一的一方设置inverse=true

首先是实体类

TAddress.java(多的一方)

public class TAddress implements Serializable {
 
    private static final long serialVersionUID = 1121137857691229229L;
    private Integer id;
    private String address;
    private String zipcode;
    private String tel;
    private String type;
    private TUser user;    //必须有
 
    ............
}

TUser.java(一的一方)

public class TUser implements Serializable {
 
    private static final long serialVersionUID = 1224691192698621789L;
    private Integer id;
    private Integer age;
    private String name;
    @SuppressWarnings("rawtypes")
    private Set address = new HashSet();    //多的一方放在集合中
  
             ....................
}

然后是各个实体类的配置文件

TAddress.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<!-- 一对多 -->
<hibernate-mapping>
<class name="com.model.TAddress" table="t_address"
dynamic-update="false" dynamic-insert="false"> <id name="id" type="java.lang.Integer" column="id" unsaved-value="0">
<generator class="native" />
</id> <property name="address" column="address" type="string" />
<property name="tel" column="tel" type="string" />
<property name="zipcode" column="zipcode" type="string" />
<property name="type" column="type" type="string" /> <!-- 必须有many-to-one 否则关联字段(user_id)为null -->
<many-to-one name="user"
class="com.model.TUser"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="user_id"
not-null="true">
</many-to-one>
</class>
</hibernate-mapping>

TUser.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<!-- 一对多 外键关联 -->
<!-- Select from TUser where id=1 Select from TUser where id=1 to Select
from TUser where id=1 or id=2 -->
<!-- batch-size 批量加载机制 可以自定义每次批量加载的数量 -->
<hibernate-mapping>
<class name="com.model.TUser" table="t_user" dynamic-update="true"
> <id name="id" type="java.lang.Integer" column="id" unsaved-value="0">
<generator class="native" />
</id> <property name="name" column="name" />
<property name="age" column="age" />
<set name="address" table="t_address" cascade="all" order-by="zipcode asc"
lazy="true" inverse="true">
<key column="user_id" /><!-- 确定关联的外键列 -->
<one-to-many class="com.model.TAddress" />
</set>
</class>
</hibernate-mapping>

其次是hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"> <hibernate-configuration> <session-factory> <!-- properties -->
<!-- 数据库URL -->
<property name="hibernate.connection.url">jdbc:mysql://localhost/onetomany</property>
<!-- 数据库JDBC驱动 -->
<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
<!-- 数据库用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库密码 -->
<property name="hibernate.connection.password">hello</property>
<!-- 数据库方言 -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- 是否日志调试 -->
<property name="show_sql">true</property>
<!-- 是否使用数据库外连接 -->
<property name="use_outer_join">true</property>
<!-- 事务管理 使用JDBC Transaction(使用JTA会报错) -->
<property name="transaction.factory_class">
net.sf.hibernate.transaction.JDBCTransactionFactory
</property>
<!-- 指定hibernate每次提交的SQL数量 对批量操作的性能提升帮助很大!!!!!!!!!!!!! -->
<property name="hibernate.jdbc.batch_size">25</property>
<!-- 映射文件配置,配置文件名必须包含其相对于根的全路径 -->
<mapping resource="com/model/TUser.hbm.xml" />
<mapping resource="com/model/TAddress.hbm.xml" /> </session-factory> </hibernate-configuration>

测试代码(部分)

增加

public void testSave(){
        try {
            Transaction tx=session.beginTransaction();
             
//          TUser user=(TUser) session.load(TUser.class, 1);
             
            TUser user=new TUser();
            user.setName("zhangsan");
            user.setAge(20);
             
            TAddress address=new TAddress();
            address.setAddress("jingsan");
            address.setTel("1361380");
            address.setZipcode("45000");
            address.setType("java");
            address.setUser(user); //设置关联的TUser对象
            user.getAddress().add(address);
             
            session.save(user);   //级联更新
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
        }
    }

查询

public void testLoad(){
    try {
        Transaction tx=session.beginTransaction();
        String hql="from TUser where name='zhangsan'";
        List list=session.createQuery(hql).list();
        System.out.println("-------------1------------");
        Iterator iter=list.iterator();
        while(iter.hasNext()){
            TUser user=(TUser) iter.next();
            System.out.println("--------------2------------");
            System.out.println("user.name="+user.getName());
            System.out.println("--------------3------------");
            System.out.println("user.address="+user.getAddress().size());
            System.out.println("--------------4------------");
        }
    } catch (HibernateException e) {
        e.printStackTrace();
    }
     
}

批量插入(可以提高性能)

实现机制:如果使用了批量加载机制,hibernate在进行数据查询操作前,会自动在当前session中寻找是否还存在
 其他同类型待加载的数据,如果有,则将其查询条件合并在当前的select语句中一并提交,这样,通过
 一次数据库操作即完成了多个读取任务。

//批量插入操作性能优化  通过配置<property name="hibernate.jdbc.batch_size">25</property>
    public void testBatchInsert(){
        long start=System.currentTimeMillis();
        this.importUserList();
        long end=System.currentTimeMillis();
        System.out.println("批量插入花费时间是"+(end-start));
    }
    public void importUserList(){
        try {
            Transaction tx=session.beginTransaction();
            for(int i=0;i<10000;i++){
                TUser user=new TUser();
                user.setName("user"+i);
                session.save(user);
                if(i%25==0){    //以每25个数据作为一个处理单元
                    session.flush();
                    session.clear();
                }
            }
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
        }
    }

Hibernate学习之一对多关联的更多相关文章

  1. Hibernate学习笔记(四)关系映射之一对一关联映射

    一. 一对一关联映射 ²        两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²        有两种策略可以实现一对一的关联映射 Ø        主键关联:即让 ...

  2. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  3. Hibernate学习之映射关系

    一.Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1.“多”端实体加入引用“一”端实体的变量及g ...

  4. Hibernate学习笔记(1)Hibernate构造

    一 准备工作 首先,我们将创建一个简单的基于控制台(console-based)Hibernate应用. 我们所做的第一件事就是创建我们的开发文件夹.并把所有需要用到的Java件放进去.解压缩从Hib ...

  5. Hibernate 学习教程

    第1课 课程内容. 6 第2课Hibernate UML图. 6 第3课 风格. 7 第4课 资源. 7 第5课 环境准备. 7 第6课 第一个演示样例HibernateHelloWorld 7 第7 ...

  6. Hibernate学习(二)关系映射----基于外键的单向一对一

    事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...

  7. Hibernate学习大全

    第1课 课程内容. 6 第2课Hibernate UML图. 6 第3课 风格. 7 第4课 资源. 7 第5课 环境准备. 7 第6课 第一个示例HibernateHelloWorld 7 第7课 ...

  8. Hibernate 单项一对多的关联映射

    在上一篇中我们简单介绍了多对一的关联映射,本文介绍hibernate中一对多的关联映射. 1.设计表结构 虽然关联关系由多对一变为一对多,但是我们表结构不会发生改变,只是指向变了. 2.创建stude ...

  9. Hibernate 单项多对一的关联映射

    在日常开发中会出现很对多对一的情况,本文介绍hibernate中多对一的关联映射. 1.设计表结构 2.创建student对象 3.创建Grade对象 4.写hbm.xml文件 5.生成数据库表 生成 ...

随机推荐

  1. python之numpy库[1]

    python-numpy python中的数据 一维数据 用列表和集合表示 数组与列表的关系 列表:数据类型可以不同 数组:数据类型可以相同 多维数据 用列表表示 高维数据 用字典表示 高维数据仅利用 ...

  2. javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  3. 搭建rtmp直播流服务之1:使用nginx搭建rtmp直播流服务器(nginx-rtmp模块的安装以及rtmp直播流配置)

    欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) 一.方案简要 首先通过对开发方案的仔细研究(实时监控.流媒体.直播流方案的数据源-->协议转换-->服务器--&g ...

  4. Dubbo有意思的特性介绍

    Duboo 不单让我们可以像使用本地服务一样的使用远程服务,还设计了很多特性来满足我们平时开发时常见的场景,省却了我们不少麻烦,真是一款有良心的框架,下面针对这些场景和解决方案来具体解释下: 1.接口 ...

  5. Mac系统占用空间大、空间不够、查看系统文件大小分布

    最近电脑老提示空间不够,甚是心烦,决定研究下,为啥空间这么快就花完了. 如图,256的空间,就剩下几个G了,其中最大头的系统占用:160G,占比60%多,我勒个擦... 正常情况下:我们可以点击管理, ...

  6. Javascript数组操作详细解答

    数组push()方法向数组尾部追加新元素,返回值为新数组的长度;括号里面带新追加的元素pop()方法从数组尾部移除一个元素,返回值为移除的元素括号里面不能带参数 shift()方法从数组头部移除一个元 ...

  7. 深入理解JavaScript中的闭包

    闭包没有想象的那么简单 闭包的概念在JavaScript中占据了十分重要的地位,有不少开发者分不清匿名函数和闭包的概念,把它们混为一谈,我希望借这篇文章能够让大家对闭包有一个清晰的认识. 大家都知道变 ...

  8. H5 web 存储之 Webstorage

    H5提供了两种在客户端存储数据的方式:localStorage 持久化的本地存储(浏览器关闭重新打开数据依然存在)sessionStorage 针对一个session的本地存储之前这些都是由cooki ...

  9. postgresql初体验

    docker pull orchardup/postgresql docker run -d -p 5432:5432 -e POSTGRESQL_USER=test -e POSTGRESQL_PA ...

  10. Linux下nginx+多个Tomcat负载均衡的实现

    博主原创,转载请注明. 由于项目需要,共创建了10个Tomcat端,由nginx负责转发.9个Tomcat端口分别是8080,11000,12000,13000,14000,15000,16000,1 ...