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表:
t_address表:
四,集合映射之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();
}
五,总结
不总结了...