欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate之集合映射

程序员文章站 2022-05-13 19:58:33
...

一,概述

需求:用户购买,填写地址.分析:一个用户是可以有多个地址的,那怎样映射比较好呢?当然是集合映射了.(这概述写的好差劲!!!)

二,JavaBean及映射文件设计

1)JavaBean设计

public class User {

    public User() {

    }

    private int userId;
    private String userName;
    // 一个用户对应多个地址
    private Set<String> address;
      //相应的setter和getter方法没有粘贴出来
}
2)User对应的映射文件

<?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.bighuan.a_collection">
	<!-- 对象与表对应 -->
	<class name="User" table="t_user1">
		<!-- 属性与字段对应 -->
		<!-- 主键 ,映射-->
		<id name="userId" column="id">
			<generator class="native" />
		</id>
		<!-- 属性映射 -->
		<property name="userName"></property>
		
		<!-- 
			set集合映射 
			name指定要映射的set集合的属性
			table 集合属性要映射的表
			key 指定集合表(t_address)的外键字段
			element 指定集合表的其他字段,这里没有JavaBean类型匹配,一定要指定类型
		-->
		<set name="address" table="t_address">
			<key column="uid"></key>
			<element column="address" type="string"></element>
		</set>
		
	</class>

</hibernate-mapping>

三,测试

1)代码

package com.bighuan.a_collection;

import java.util.HashSet;
import java.util.Set;

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

public class App {

	private static SessionFactory sf;

	static {
		sf = new Configuration().configure().buildSessionFactory();
	}

	@Test
	public void testSaveSet() throws Exception {
		// 获得session
		org.hibernate.Session session = sf.openSession();

		session.beginTransaction();

		Set<String> addrSet = new HashSet<String>();
		addrSet.add("江西南昌");
		addrSet.add("广东深圳");
		User user = new User();
		user.setUserName("leslie");
		user.setAddress(addrSet);
		session.save(user);
		session.getTransaction().commit();
		session.close();
	}
}
2)插入数据后的效果

t_user1表:

Hibernate之集合映射

t_address表:

Hibernate之集合映射

四,集合映射之List Map

1)List与Map的方式和Set集合的差不多,在前面的User.java中增加这两行代码,并实现相应的setter和getter方法.

private List<String> addressList = new ArrayList<String>();
private Map<String, String> addressMap = new HashMap<String, String>();
2)在User.hbm.xml中进行配置

                 <!-- 
			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>
3)测试

        @Test
	public void testSaveList() throws Exception {
		// 获得session
		org.hibernate.Session session = sf.openSession();

		session.beginTransaction();

		User user = new User();
		user.setUserName("leslie");
		user.getAddressList().add("北京海淀");
		user.getAddressList().add("上海小镇");
		session.save(user);
		session.getTransaction().commit();
		session.close();
	}

	@Test
	public void testSaveMap() throws Exception {
		// 获得session
		org.hibernate.Session session = sf.openSession();

		session.beginTransaction();

		
		User user = new User();
		user.setUserName("张国荣");
		user.getAddressMap().put("A001", "香港铜锣湾");
		user.getAddressMap().put("A002", "四川成都");
		session.save(user);
		session.getTransaction().commit();
		session.close();
	}

五,总结

不总结了...