3.一起来学hibernate之配置文件2

之前的映射文件配置都是简单的、基础的配置,只涉及到单个javabean,对于单个javabean的增删改查都能很好的、简单的去完成。

但是知道简单配置远远不够,并不能完成很多复杂的情况,比如对象与对象间的关联,对象中的集合属性等,所以还需更近一步的学习hibernate映射文件的配置。

本次映射文件配置涉及到集合、排序、多对一、一对多、多对多、以及一对一的内容等。

1.集合属性(Set、List、Map、数组)

  1.1Set集合:

  首先,创建一个User实体类,实体类是一个买家账号,包含id、name、addressSet(set集合,存放多个地址,地址不重复)

//该实体是买家实体
public class User {

    private Integer id;// 买家id
    private String name;// 买家名字
    private Set<String> addressSet;// 买家地址,可以有多个,但是不能重复

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Set<String> getAddressSet() {
        return addressSet;
    }
    public void setAddressSet(Set<String> addressSet) {
        this.addressSet = addressSet;
    }
}

  接着配置映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.Collection">
    <class name="User" table="user">
        <id name="id" type="int" column="id">
            <generator class="native"/>
        </id>
        <property name="name" type="string" column="name" length="20"/>
        <!-- addressSet属性,在javabean中是一个set集合 -->
        <!-- name为javabean中的属性名,table为另一张表user_addr -->
        <!-- user_addr表主键其实是user表的外键 -->
        <set name="addressSet" table="user_addr">
            <!-- user_addr外键 -->
            <key column="addrId"/>
            <!-- user_addr表address列 -->
            <element type="string" column="address"/>
        </set>
    </class>
</hibernate-mapping>

  表结构如下:

CREATE TABLE `user` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(20) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE=‘utf8_general_ci‘
ENGINE=InnoDB
AUTO_INCREMENT=2;

CREATE TABLE `user_addr` (
    `addrId` INT(11) NOT NULL,
    `address` VARCHAR(255) NULL DEFAULT NULL,
    INDEX `FK14340FE5D5E4BA1E` (`addrId`),
    CONSTRAINT `FK14340FE5D5E4BA1E` FOREIGN KEY (`addrId`) REFERENCES `user` (`id`)
)
COLLATE=‘utf8_general_ci‘
ENGINE=InnoDB;

  测试程序:

public class App {

    private static SessionFactory sessionFactory;

    static {
        Configuration cfg = new Configuration();
        cfg.configure("hibernate.cfg.xml");
        sessionFactory = cfg.buildSessionFactory();
    }

    public static void main(String[] args) {
        User u = new User();
        u.setId(1);
        u.setName("testName");
        Set<String> s = new HashSet<String>();
        s.add("BeiJing 12");
        s.add("HongKong 35");
        s.add("ShangHai 113");
        u.setAddressSet(s);

        Session session = sessionFactory.openSession();
        Transaction tx = null;
        try {
            tx= session.beginTransaction();
            tx.begin();
            session.save(u);
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            e.printStackTrace();
        } finally{
            session.close();
            sessionFactory.close();
        }
    }
}

  最终hibernate帮我们执行的sql代码:

Hibernate: insert into user (name) values (?)
Hibernate: insert into user_addr (addrId, address) values (?, ?)
Hibernate: insert into user_addr (addrId, address) values (?, ?)
Hibernate: insert into user_addr (addrId, address) values (?, ?)

  上述程序说明:

  实体类User是一个买家账号类,该账号的id和name配置不多描述,主要说明addressSet集合,该集合存放多个地址,那么当我们存储数据到数据库中,user表的数据应该是这样子的:

id     name
1      testName
2      testName2

  由于一个User地址是多个,所以地址没办法在user表中的一个账号中体现出来,唯有创建一张地址表,用来被user表的用户指向,那么地址表的数据就是这样子的:

addrId        address
   1           123号
   1           456号
   2           789号

  所以我们再次查看配置文件有关于集合的配置:

<set name="addressSet" table="user_addr">
    <!-- user_addr外键 -->
    <key column="addrId"/>
    <!-- user_addr表address列 -->
    <element type="string" column="address"/>
</set>

  上述配置,set name代表的是javabean中的集合名称,而table代表的是地址表user_addr,同时必须指出地址表的外键,以及地址表其他字段。

  举一反三,知道怎么存入数据,当然要知道怎么获取数据:

public class App {

    private static SessionFactory sessionFactory;

    static {
        Configuration cfg = new Configuration();
        cfg.configure("hibernate.cfg.xml");
        sessionFactory = cfg.buildSessionFactory();
    }

    public static void main(String[] args) {
        User u = new User();
        Session session = sessionFactory.openSession();
        Transaction tx = null;
        try {
            tx= session.beginTransaction();
            tx.begin();
            u = (User) session.get(User.class, 1);
            System.out.println(u);
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            e.printStackTrace();
        } finally{
            session.close();
            sessionFactory.close();
        }
    }
}

  hibernate帮我们查询的sql代码:

Hibernate:
    select
        user0_.id as id0_0_,
        user0_.name as name0_0_
    from
        user user0_
    where
        user0_.id=?
Hibernate:
    select
        addressset0_.addrId as addrId0_0_,
        addressset0_.address as address0_
    from
        user_addr addressset0_
    where
        addressset0_.addrId=?

  得出结果:

  User [id=1, name=testName, addressSet=[BeiJing 12, ShangHai 113, HongKong 35]]

  1.2List集合,跟set集合很相似,唯一的不同是在映射文件的集合配置

  把实体类属性更改一下:

//该实体是买家实体
public class User {

    private Integer id;// 买家id
    private String name;// 买家名字
    private List<String> cargo;// 购物车商品,可多个,也可重复

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List<String> getCargo() {
        return cargo;
    }
    public void setCargo(List<String> cargo) {
        this.cargo = cargo;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", cargo="
                + cargo + "]";
    }
}

  映射文件配置,相比set集合配置多了一个<list-index>标签:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.Collection">
    <class name="User" table="user">
        <id name="id" type="int" column="id">
            <generator class="native"/>
        </id>
        <property name="name" type="string" column="name" length="20"/>
        <list name="cargo" table="cargo_list">
            <key column="cargoId"/>
            <!-- list集合表,同一个用户购物车商品的顺序 -->
            <list-index column="idx"/>
            <element type="string" column="cargoName"/>
        </list>
    </class>
</hibernate-mapping>

  测试程序:

public class App {

    private static SessionFactory sessionFactory;

    static {
        Configuration cfg = new Configuration();
        cfg.configure("hibernate.cfg.xml");
        sessionFactory = cfg.buildSessionFactory();
    }

    public static void main(String[] args) {
        User u = new User();
        u.setId(1);
        u.setName("testName");
        List<String> cargoList = new ArrayList<String>();
        cargoList.add("pancel");
        cargoList.add("apple");
        cargoList.add("water");
        u.setCargo(cargoList);
        Session session = sessionFactory.openSession();
        Transaction tx = null;
        try {
            tx= session.beginTransaction();
            tx.begin();
            session.save(u);
            System.out.println(u);
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            e.printStackTrace();
        } finally{
            session.close();
            sessionFactory.close();
        }
    }
}

  查看hibernate帮我们生成的sql语句:

Hibernate:
    insert
    into
        user
        (name)
    values
        (?)
User [id=1, name=testName, cargo=[pancel, apple, water]]
Hibernate:
    insert
    into
        cargo_list
        (cargoId, idx, cargoName)
    values
        (?, ?, ?)
Hibernate:
    insert
    into
        cargo_list
        (cargoId, idx, cargoName)
    values
        (?, ?, ?)
Hibernate:
    insert
    into
        cargo_list
        (cargoId, idx, cargoName)
    values
        (?, ?, ?)

  表结构和数据:

  user表

  cargo_list表

  1.3数组(跟list集合配置一模一样,除了list集合标签使用<list></list>,而数组使用<array></array>)

  依旧是更改一下user实体

//该实体是买家实体
public class User {

    private Integer id;// 买家id
    private String name;// 买家名字
    private String[] cargo;// 购物车商品,可多个,也可重复

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String[] getCargo() {
        return cargo;
    }
    public void setCargo(String[] cargo) {
        this.cargo = cargo;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", cargo="
                + cargo + "]";
    }
}

  映射文件配置:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.Collection">
    <class name="User" table="user">
        <id name="id" type="int" column="id">
            <generator class="native"/>
        </id>
        <property name="name" type="string" column="name" length="20"/>
        <array name="cargo" table="user_addressArray">
            <key column="addrId"/>
            <list-index column="idx"/>
            <element type="string" column="address"/>
        </array>
    </class>
</hibernate-mapping>

  测试程序:

public class App {

    private static SessionFactory sessionFactory;

    static {
        Configuration cfg = new Configuration();
        cfg.configure("hibernate.cfg.xml");
        sessionFactory = cfg.buildSessionFactory();
    }

    public static void main(String[] args) {
        User u = new User();
        u.setId(1);
        u.setName("testName");
        String[] cargo = {"computer","iphone6s","ipad"};
        u.setCargo(cargo);
        Session session = sessionFactory.openSession();
        Transaction tx = null;
        try {
            tx= session.beginTransaction();
            tx.begin();
            session.save(u);
            System.out.println(u);
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            e.printStackTrace();
        } finally{
            session.close();
            sessionFactory.close();
        }
    }
}

  查看hibernate为我们生成的sql语句:

Hibernate:
    insert
    into
        user
        (name)
    values
        (?)
User [id=1, name=testName, cargo=[Ljava.lang.String;@f737a7]
Hibernate:
    insert
    into
        user_addressArray
        (addrId, idx, address)
    values
        (?, ?, ?)
Hibernate:
    insert
    into
        user_addressArray
        (addrId, idx, address)
    values
        (?, ?, ?)
Hibernate:
    insert
    into
        user_addressArray
        (addrId, idx, address)
    values
        (?, ?, ?)

  表结构和数据:

  user表

  user_addressArray表

  1.4Map集合

  仍然修改一下user实体

//该实体是买家实体
public class User {

    private Integer id;// 买家id
    private String name;// 买家名字
    private Map<String,String> map = new HashMap<String,String>();// 地址+邮政编码

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Map<String, String> getMap() {
        return map;
    }
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", map="
                + map + "]";
    }
}

  映射文件配置:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.Collection">
    <class name="User" table="user">
        <id name="id" type="int" column="id">
            <generator class="native"/>
        </id>
        <property name="name" type="string" column="name" length="20"/>
        <map name="map" table="user_map">
            <!-- user_map外键 -->
            <key column="mapId"/>
            <!-- 由于javabean属性是map集合,所以必须配置key和value -->
            <map-key type="string" column="mapKey"/>
            <element type="string" column="mapValue"/>
        </map>
    </class>
</hibernate-mapping>

  测试程序:

public class App {

    private static SessionFactory sessionFactory;

    static {
        Configuration cfg = new Configuration();
        cfg.configure("hibernate.cfg.xml");
        sessionFactory = cfg.buildSessionFactory();
    }

    public static void main(String[] args) {
        User u = new User();
        u.setId(1);
        u.setName("testName");
        Map<String,String> map = new HashMap<String,String>();
        map.put("xiaMen", "361100");
        map.put("fuZhou", "351100");
        u.setMap(map);
        Session session = sessionFactory.openSession();
        Transaction tx = null;
        try {
            tx= session.beginTransaction();
            tx.begin();
            session.save(u);
            System.out.println(u);
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            e.printStackTrace();
        } finally{
            session.close();
            sessionFactory.close();
        }
    }
}

  hibernate帮我们生成的sql语句:

Hibernate:
    insert
    into
        user
        (name)
    values
        (?)
User [id=2, name=testName, map={xiaMen=361100, fuZhou=351100}]
Hibernate:
    insert
    into
        user_map
        (mapId, mapKey, mapValue)
    values
        (?, ?, ?)
Hibernate:
    insert
    into
        user_map
        (mapId, mapKey, mapValue)
    values
        (?, ?, ?)

  表结构和数据:

  user表

  user_map表

2.排序order-by

说明,这里的orderby指的是查询出来的集合表中数据的排序,只能在映射文件的集合中配置

<!--
    orderby排序的是集合表的数据,
    由于集合表现在有3个字段(从以下很容易看出mapId、mapKey、mapValue),
    所以通过哪个字段排序看你自己 ;
    order-by内可以指定排序:ASC DESC,默认是ASC,不区分大小写
-->
<map name="map" table="user_map" order-by="mapKey DESC">
    <!-- user_map外键 -->
    <key column="mapId"/>
    <!-- 由于javabean属性是map集合,所以必须配置key和value -->
    <map-key type="string" column="mapKey"/>
    <element type="string" column="mapValue"/>
</map>

3.多对一和一对多以及一对一和多对多

未完待续。。。

时间: 2024-11-11 04:34:31

3.一起来学hibernate之配置文件2的相关文章

2.一起来学hibernate之配置文件1与持久化对象

学框架,配置都是不可少的,有了配置,框架才知道我们想做什么,才知道如何去执行我们需要的操作! hibernate的配置文件,总体来说分为两个部分: 1.主配置文件hibernate.cfg.xml文件,一般放在classpatn路径下 2.映射文件xxx.hbm.xml文件,一般跟实体类放在同一个包下 前者是配置相关的数据库以及引入的映射文件信息,而后者则主要配置对象与表之间的映射关系: 注意:配置文件的路径,因人而异,有的将映射文件集体放置在一起也有,所以看个人喜好,没有强制规定如何存放. 以

spring(一)--spring/springmvc/spring+hibernate(mybatis)配置文件

这篇文章用来总结一下spring,springmvc,spring+mybatis,spring+hibernate的配置文件 1.web.xml 要使用spring,必须在web.xml中定义分发器等信息,基本的配置信息如下: <?xml version="1.0" encoding= "UTF-8"?> <web-app version= "3.0" xmlns="http://java.sun.com/xml/n

1.一起来学hibernate之hibernate简介

一.简介 Hibernate,是一个开源的ORM框架.所谓的ORM,即object relative mapping,就是对象关系映射. 那什么是对象关系映射? 对象,即java类,又称为实体类,对象一般用来存放数据: 关系:即关系型数据库,例如mySQL.oracle.DB2等等都是关系型数据库: 映射:个人理解为对象和数据库的表一一对应的桥梁,即实体对应数据库表,属性对应表中列. 那为什么需要hibernate? hibernate提供一套api供开发者调用,通过api,可以简化对数据库的操

Hibernate学习笔记(一) — hibernate的配置文件简介与执行原理

一.初识Hibernate 1.JDBC的缺点: 1).编写代码的时候过于繁琐,try和catch比较多2).没有做数据缓存 3).不是面向对象编程 4).sql语句固定,可移植性差 JDBC的优点:效率比较高 2.Hibernate优点 1).完全面向对象编程 2).hibernate的缓存很牛的,一级缓存,二级缓存,查询缓存3).跨平台性强 4).使用场合多应用于企业内部的系统 Hibernate缺点 1).效率低 2).表中的数据如果在千万级别,则hibernate不适合 3).如果表与表

Hibernate之配置文件以及对象关系映射文件了解

声明:CSDN不知道怎么了,有时候就是发表不了博文.本来就是一天一篇博文,最近搞的我很郁闷.有时候一天,有时候两三天都不能发.这就属于不可抗力.没办法的,啥时能发,我就发了. 一.学习案例:关于hibernate的配置文件以及对象关系映射文件的了解. 二.案例分析: a)hibernate配置文件(hibernate.cfg.xml) 1.hibernate.dialect:数据库使用的SQL方言 2.hiebrnate.connection.driver_class:数据库的驱动程序 3.hi

Hibernate常用配置文件详解

本文转载自:http://blog.csdn.net/csh624366188/article/details/7578939 初学hibernate的童鞋,刚开应该都有这种感觉,hibernate的配置文件好麻烦,还不如jdbc访问数据库呢,直接写代码,多方便,用hibernate还要写代码,还要写配置,太麻烦了.至少我刚开始学习的时候就是这么想的.配置文件确实有他枯燥的一面,但等你真正深入学习的时候,你就可以发现他枯燥的背后却藏着很多强大的功能,呵呵,让我说的这么玄乎,那就让我们一起来看看吧

Hibernate之配置文件

可持久化对象有以下三种状态: 临时状态(Transient):对象在保存进数据库之前为临时状态,这时数据库中没有该对象的信息,如果没有持久化,程序退出后临时状态的对象信息将会丢失.随时可能被垃圾回收器回收(在数据库中没有于之对应的记录,应为是new初始化),而执行save()方法后,就变为Persistent对象(持久性对象),没有纳入session的管理,内存中一个对象,没有ID,缓存中也没有 持久化状态(Persistent):对象在保存进数据库后或者从数据库加载后.并且没有脱离Sessio

快学Hibernate

1.1持久化,DAO与ORM 介绍持久化,DAO与ORM三个概念,以及它们之间的关系. 1.1.1 持久化 数据在计算机中有两种状态: 瞬时状态:保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态 持久状态:保存在磁盘上的程序数据,程序退出后依然存在,称为程序数据的持久状态.持久化的数据保存在各种文件中,这些文件有不同的后缀,表示不同的类型,这些不同后缀的文件,需要不同的软件读取它. 持久化:将程序数据在瞬时状态和持久状态之间相互转换的机制 图一:持久化 现在的项目大多使用三层构架,即

eclipse 新建 maven 项目 添加 spring hibernate 的配置文件 详情

主要配置文件 pom.xml 项目的maven 配置文件 管理项目所需 jar 依赖支持 web.xml 项目的总 配置文件  :添加 spring和hibernate 支持 applicationContext.xml   hibernate的配置文件 sping-servlet.xml spring的配置文件 jdbc-properties 数据库连接属性 文件 ------------------------------pom.xml 开始-------------------------