您的位置:首页 > 其它

Hibernate(五)映射集合属性及排序

2015-07-14 20:49 645 查看
这里先将集合Set在数据库中的存储。就是新建一个表,新建的表的主键对应另一张的外键,而集合的每个值对应一条记录,以同一个set的数据以主键值相同的记录区分。

set集合是其它几种集合的基础,所以要了解List、Map、Bag、Array在数据库中的存储先了解Set

package test.hibernate.set;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

public class User {

private Integer id;
private String name;
private Set<String> addressSet = new HashSet<String>();
private List<String> addressList = new ArrayList<String>();
private String[] addressArray;// 数组
private Map<String, String> addressMap = new HashMap<String, String>();
private List<String> addressBag = new ArrayList<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 Set<String> getAddressSet() {
return addressSet;
}

public void setAddressSet(Set<String> addressSet) {
this.addressSet = addressSet;
}

public List<String> getAddressList() {
return addressList;
}

public void setAddressList(List<String> addressList) {
this.addressList = addressList;
}

public String[] getAddressArray() {
return addressArray;
}

public void setAddressArray(String[] addressArray) {
this.addressArray = addressArray;
}

public Map<String, String> getAddressMap() {
return addressMap;
}

public void setAddressMap(Map<String, String> addressMap) {
this.addressMap = addressMap;
}

public List<String> getAddressBag() {
return addressBag;
}

public void setAddressBag(List<String> addressBag) {
this.addressBag = addressBag;
}

public static void main(String[] args) {
// Set<String> set = new HashSet<String>();
// Set<String> set = new TreeSet<String>();
Set<String> set = new LinkedHashSet<String>();
set.add("kk");
set.add("aa");
set.add("bb");
set.add("cc");
set.add("dd");

System.out.println(set);
}
}

测试几种集合

HashSet



TreeSet



LinkedHashSet



package test.hibernate.set;

import java.lang.reflect.Array;
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<String> set = new TreeSet<String>();
set.add("cc");
set.add("dd");
set.add("aa");
set.add("bb");
user.setAddressSet(set);
user.getAddressList().add("浙江省");
user.getAddressList().add("上海市");
user.getAddressList().add("上海市");
user.setAddressArray(new String[] { "广东省", "深圳市", "福田区", "福田区" });
user.getAddressMap().put("省份", "浙江");
user.getAddressMap().put("家庭", "深圳");
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, 10);

// 显示数据
System.out.println(user.getId());
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();
}
}


映射文件的配置也是重点

<?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="test.hibernate.set">
<class name="User" table="t_user">

<id name="id">
<generator class="native"></generator>
</id>

<property name="name" />
<!-- addressSet属性是Set类型,集合元素不可重复 -->
<!-- 只有无限的set才能用sort方法进行排序,且初始化时要
用SortedSet,也就是有序的集合类型
sort属性:"unsorted|natural|comparatorClass"。默认为unsorted
sort="natural"
order-by属性:写的是order by子句,是SQL语句,是操作的集合表, 默认为升序asc,desc降序 这里sort通过在内存中对地址排序,order-by查询的时候通过select子句排序,
效率比用sort方法高 -->
<set name="addressSet" table="user_addressSet" order-by="address desc">
<key column="userId"></key>
<element type="string" column="address"></element>
</set>
<!-- 集合元素有序 -->
<list name="addressList" table="user_addressList">
<!-- 集合外键的列名 -->
<key column="userId"></key>
<!-- 索引 -->
<list-index column="idx"></list-index>
<element type="string" column="address"></element>
</list>
<!-- array数组,与list基本相同,注意定义的子元素顺序不能变 -->
<array name="addressArray" table="user_addressArray">
<key column="userId"></key>
<list-index column="idx"></list-index>
<element type="string" column="address"></element>
</array>
<!-- 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>
<!-- bay集合,与set集合基本相同,无序,只不过元素可重复 -->
<bag name="addressBag" table="user_addressBag">
<key column="userId"></key>
<element type="string" column="address"></element>
</bag>

</class>
</hibernate-mapping>

主文件配置基本相同。

查看数据库由代码生成的表,注意映射关系













看看数据在表中的存储:













原文出处:http://blog.csdn.net/lindonglian/article/details/46883225
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: