先来个对象:
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