(05)String类型的集合映射

基本的需求是:用户购买东西,有多个地址。

这篇文章关注的是String类型的Set、List和Map数据如何与数据库中的表建立映射关系,在下一篇文章中,会String类型进一步修改为用户自定义的类型。这篇文章的重点是学习.hbm.xml中映射的写法。

User.java

package com.rk.hibernate.f_collections;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class User
{
	private int uid;
	private String username;
	private Set<String> addressSet;
	private List<String> addressList;
	private Map<String, String> addressMap;

	public Map<String, String> getAddressMap()
	{
		return addressMap;
	}
	public void setAddressMap(Map<String, String> addressMap)
	{
		this.addressMap = addressMap;
	}
	public List<String> getAddressList()
	{
		return addressList;
	}
	public void setAddressList(List<String> addressList)
	{
		this.addressList = addressList;
	}
	public Set<String> getAddressSet()
	{
		return addressSet;
	}
	public void setAddressSet(Set<String> addressSet)
	{
		this.addressSet = addressSet;
	}
	public int getUid()
	{
		return uid;
	}
	public void setUid(int uid)
	{
		this.uid = uid;
	}
	public String getUsername()
	{
		return username;
	}
	public void setUsername(String username)
	{
		this.username = username;
	}

}

在User.java中,有Set、List和Map三种类型的数据,它的基础类型是String

	private Set<String> addressSet;
	private List<String> addressList;
	private Map<String, String> addressMap;

User.hbm.xml,这里是学习的重点:Set、List和Map三种类型是如何进行映射的

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.rk.hibernate.f_collections" auto-import="true">
	<class name="User" table="T_Users">
		<id name="uid" column="id">
			<generator class="native"></generator>
		</id>
		<property name="username" column="name" type="string"></property>

		<!-- 
			set集合属性的映射
				name 指定要映射的set集合的属性
				table 集合属性要映射到的表
				key  指定集合表(t_address)的外键字段
				element 指定集合表的其他字段
					type 元素类型,一定要指定
		 -->
		<set name="addressSet" table="T_addressSet">
			<key column="uid"></key>
			<element column="address" type="string"></element>
		</set>

		 <!-- 
		 	list集合映射
		 		list-index  指定的是排序列的名称 (因为要保证list集合的有序)
		  -->
		<list name="addressList" table="T_AddressList">
			<key column="uid"></key>
			<list-index column="idx"></list-index>
			<element column="address" type="string"></element>
		</list>

		  <!-- 
		  	map集合的映射
		  		key  指定外键字段
		  		map-key 指定map的key 
		  		element  指定map的value
		   -->
		<map name="addressMap" table="T_AddressMap">
			<key column="uid"></key>
			<map-key column="shortName" type="string"></map-key>
			<element column="address" type="string"></element>
		</map>
	</class>
</hibernate-mapping>

App.java,这里主要是写代码进行测试

package com.rk.hibernate.f_collections;

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

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

public class App
{
	private static SessionFactory sf;
	static
	{
		sf = new Configuration().configure().addClass(User.class).buildSessionFactory();
	}

	// 保存set
	@Test
	public void testSaveSet()
	{
		Session session = sf.openSession();
		session.beginTransaction();

		// 用户对象
		User u = new User();
		u.setUsername("小刚");
		// 添加地址
		Set<String> addressSet = new HashSet<String>();
		addressSet.add("北京");
		addressSet.add("上海");
		u.setAddressSet(addressSet);
		// 保存
		session.save(u);

		session.getTransaction().commit();
		session.close();
		System.out.println("执行结束!");
	}

	// 保存list
	@Test
	public void testSaveList()
	{
		Session session = sf.openSession();
		session.beginTransaction();

		// 用户对象
		User u = new User();
		u.setUsername("小蓝");
		// 添加地址
		List<String> list = new ArrayList<String>();
		list.add("石家庄");
		list.add("保定");
		u.setAddressList(list);
		// 保存
		session.save(u);

		session.getTransaction().commit();
		session.close();
		System.out.println("执行结束!");
	}

	// 保存map
	@Test
	public void testSaveMap()
	{
		Session session = sf.openSession();
		session.beginTransaction();

		// 用户对象
		User u = new User();
		u.setUsername("小花");
		// 添加地址
		Map<String, String> map = new HashMap<String, String>();
		map.put("京", "北京");
		map.put("冀", "河北");
		u.setAddressMap(map);
		// 保存
		session.save(u);

		session.getTransaction().commit();
		session.close();
		System.out.println("执行结束!");
	}

	// 获取
	@Test
	public void testGetList()
	{
		Session session = sf.openSession();
		session.beginTransaction();

		// 获取
		User u = (User) session.get(User.class, 5);// 及时加载
		System.out.println(u.getUid());
		System.out.println(u.getUsername());

		// 当查询用户,同时可以获取用户关联的list集合的数据 (因为有正确映射)
		// 当使用到集合数据的使用,才向数据库发送执行的sql语句 (懒加载)
		System.out.println(u.getAddressList());

		session.getTransaction().commit();
		session.close();
		System.out.println("执行结束!");
	}

}
时间: 2024-10-12 10:37:33

(05)String类型的集合映射的相关文章

再谈怎样以最简单的方法将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式

今天review代码,看见某些大爷在将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式时仍然仅仅顾结果不注重过程,"大爷"咱能负点责任吗? 将泛型为String类型的集合转化为逗号间隔字符串形式: 測试类: package com.ghj.packageofclient; import java.util.ArrayList; import java.util.List; import com.ghj.packageoftool.StringUtils; p

再谈如何以最简单的方法将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式

今天review代码,看见某些大爷在将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式时仍然只顾结果不注重过程,"大爷"咱能负点责任吗? 将泛型为String类型的集合转化为逗号间隔字符串形式: 测试类: package com.ghj.packageofclient; import java.util.ArrayList; import java.util.List; import com.ghj.packageoftool.StringUtils; pu

NHibernate 集合映射深入 (第五篇) &lt;set&gt;,&lt;list&gt;,&lt;map&gt;,&lt;bag&gt;

NHibernate 集合映射深入 (第五篇) <set>,<list>,<map>,<bag> 一.集合外键 在NHibernate中,典型的用于映射集合类的元素有<set>,<list>,<map>,<bag>,<array>,<primitive-array>. 我们回到上一篇,集合映射基础当中的一对多查询.对于集合类型: public virtual ISet<Person

NHibernate3剖析:Mapping篇之集合映射基础(3):List映射

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本号. 假设你还不熟悉NHibernate.能够高速阅读NHibernate之旅系列文章导航系列入门,假设你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.c

NHibernate3剖析:Mapping篇之集合映射基础(4):Map映射

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

hibernate 映射关系—集合映射

1.集合映射简介 当持久化类中有一个值类型的集合,那么就需要一张额外的数据库表来保存这个值类型集合的数据,这张表被称为集合表.比如有一张学生表,学生可能有很多爱好,就需要一种学生爱好集合表来存储学生的爱好信息. Hibernate支持大部分重要的JDK集合接口映射,主要有以下几种. 1. set 可以映射类型为java.util.Set接口的属性,它的元素存放没有顺序且不允许重复:也可映射类型为java.util.SortSet接口的属性.它的元素可以按自然顺序排列. 2. list 可以映射类

【Hibernate步步为营】--最后的集合映射

上篇文章详细讨论了组合对象映射的原理,它其实指的是如何将对象模型中的组合关系映射到关系模型中,它是通过使用Hibernate提供的<component>标签来实现的,并需要在该标签中添加对应组合对象的属性,有关组合对象的映射请查看笔者的上篇文章.该篇文章来详细讨论下集合的映射关系,Java的集合有四种分别是Set.Map.List和普通集合,在开发时往往需要将这些集合转化为对应的关系模型,这种集合映射的实现过程就是我们今天要讨论的话题. 一.集合映射 1.1 集合小介 集合映射也是基本的映射,

Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; private String userName; // 一个用户,对应的多个地址 private Set<String> address; private List<String> addressList = new ArrayList<String>(); //private Str