Hibernate (四) Set List Map 集合映射 和排序

先来个对象:
User.java 对象。

public class User {
    private Integer id;
    private String name;

    private Set<String> addressSet = new HashSet<String>(); // Set集合
    private List<String> addressList = new ArrayList<String>(); // List集合
    private String[] addressArray; // 数组
    private Map<String, String> addressMap = new HashMap<String, String>();
    private List<String> addressBag = new ArrayList<String>();
    ...自动生成 get set...

针对属性映射:

<?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="cn.itcast.e_hbm_collection">

    <class name="User" table="user">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name"/>

        <!-- addressSet属性,Set集合 
            table属性:集合表的名称
            key子元素:集合外键的列名
            element子元素:存放集合元素的列的信息
            sort属性:"unsorted|natural|comparatorClass"
                默认为:unsorted
            order-by属性:写的是order by 子句,是SQL语句,是操作的集合表。
                这是在查询数据时指定orderby子句。
        -->
        <set name="addressSet" table="user_addressSet" order-by="address ASC">
            <key column="userId"></key>
            <element type="string" column="address"></element>
        </set>

        <!-- addressList属性,List集合 
            list-index:用于存放索引的列
        -->
        <list name="addressList" table="user_addressList">
            <key column="userId"></key>
            <list-index column="idx"></list-index>
            <element type="string" column="address"></element>
        </list>

        <!-- addressArray属性,数组。与List的映射基本一致 -->
        <array name="addressArray" table="user_addressArray">
            <key column="userId"></key>
            <list-index column="idx"></list-index>
            <element type="string" column="address"></element>
        </array>

        <!-- addressMap属性,Map集合 -->
        <map name="addressMap" table="user_addressMap">
            <key column="userId"></key>
            <map-key type="string" column="key_"></map-key>
            <element type="string" column="address"></element>
        </map>

        <!-- addressBag属性,Bag集合:无序,可重复。与Set集合的映射基本一致 -->
        <bag name="addressBag" table="user_addressBag">
            <key column="userId"></key>
            <element type="string" column="address"></element>
        </bag>

    </class>

</hibernate-mapping>

测试代码:

package cn.itcast.e_hbm_collection;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class App {

    private static SessionFactory sessionFactory = new Configuration()//
            .configure()//
            .addClass(User.class)// 添加Hibernate实体类(加载对应的映射文件)
            .buildSessionFactory();

    @Test
    public void testSave() throws Exception {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // --------------------------------------------

        // 构建对象
        User user = new User();
        user.setName("张天");
        // >> Set集合
        user.setAddressSet(new TreeSet<String>()); // 当设置了sort属性时,就要使用SortedSet类型
        user.getAddressSet().add("2北京");
        user.getAddressSet().add("1北京");
        // >> List集合
        user.getAddressList().add("成都");
        user.getAddressList().add("温江");
        user.getAddressList().add("柳城");
        // >> 数组
        user.setAddressArray(new String[] { "成都", "温江" });
        // >> Map集合
        user.getAddressMap().put("公司", "成都");
        user.getAddressMap().put("家庭", "温江");
        // >> Bag集合
        user.getAddressBag().add("成都");
        user.getAddressBag().add("温江");
        user.getAddressBag().add("柳城");

        // 保存
        session.save(user);

        // --------------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    @Test
    public void testGet() throws Exception {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // --------------------------------------------

        // 获取数据
        User user = (User) session.get(User.class, 1);

        // 显示信息
        System.out.println(user.getName());
        System.out.println(user.getAddressSet());
        System.out.println(user.getAddressList());
        System.out.println(Arrays.toString(user.getAddressArray()));
        System.out.println(user.getAddressMap());
        System.out.println(user.getAddressBag());

        // --------------------------------------------
        session.getTransaction().commit();
        session.close();
    }
}

排序

有两种方式
第一种 通过 order-by=”” 语句排序 ,这种方式是在数据库查询时进行排序。(推荐用法)

<map name="addressSet" table="user_addressSet" order-by="address ASC">
     ... ...
</map>

第二种是通过 sort属性:”unsorted|natural|comparatorClass” 排序 (不推荐)
这种排数是在数据查询出来后,在内存中排序。并且使用条件是必须实现了 sort接口的集合。

<map name="addressSet" table="user_addressSet" sort="natural">
    ... ...
</map>

下面是关于 集合效率的问题
请查看 http://blog.csdn.net/zhanglinlang/article/details/60462862

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值