hibernate的四种基础集合映射set,list,map,数组映射
Set映射
步骤一:创建实体对象类,需要单独建表的属性address用Set<String>集合类型封装。
(此处省略了get() set()方法)
步骤二:配置User.hbm.xml映射表
set集合属性的映射:重点消化
name指定要映射的set集合的属性
table集合属性要映射的表
key指定集合表(t_address)的外键字段
element指定集合表的其他字段
type元素类型,一定要指定
<hibernate-mapping package="cn.itcast.collection" auto-import="true">
<class name="User" table="table_user">
<id name="id" column="user_id"> <!--配置主键-->
<generator class="native"></generator> <!-- 主键自增长方式(根据数据库自动匹配)-->
</id>
<property name="userName"></property>
<!-- Set集合 元素无放入顺序,元素不可重复 (注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的) -->
<set name="address" table="table_address"> <!--单独映射的table_address表-->
<key column="uid"></key> <!-- 外键-->
<element column="address" type="string"></element> <!-- 映射表中所存放的address数据-->
</set>
</class>
</hibernate-mapping>
步骤三:配置hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置数据库,必须有 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url"> jdbc:mysql:///hibernate?characterEncoding=UTF-8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<!-- 可选 -->
<!-- 输出底层SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 对底层SQL语句格式化 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate自动创建表,需要配置之后
update:如果有表,更新,没有则创建
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置session与本地线程绑定 -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 配置数据库方言 -->
<!--
<property name="hibernate.dialect">org.hibernate.dialectM.MySQLDialect</property>
-->
<!--hibernate只会加载核心配置文件, 把映射文件放到核心配置文件内,按Ctrl键能跳转过去说明成功 -->
<!--
<mapping resource="com/zzu/User.hbm.xml"/>
-->
<!-- <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> -->
<!--设置C3P0连接池的最大连接数 -->
<property name="hibernate.c3p0.max_size">50</property>
<!--设置C3P0连接池的最小连接数 -->
<property name="hibernate.c3p0.min_size">2</property>
<!--设置C3P0连接池中连接的超时时长,超时则抛出异常,单位为毫秒 -->
<property name="hibernate.c3p0.timeout">1000</property>
<!--C3P0缓存Statement的数量 -->
<property name="hibernate.c3p0.max_statements">60</property>
<property name="myeclipse.connection.profile">
mysql_test
</property>
<!-- 方言 -->
<property name="dialect">
org.hibernate.dialect.MySQL5InnoDBDialect
</property>
<mapping resource="map/Users.hbm.xml"/>
</session-factory>
</hibernate-configuration>
步骤四:测试类
package com.test;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import map.User;
public class TestMap {
@Test
public void testMap() {
Transaction tx = null;
SessionFactory sessionFactory = null;
Session session = null;
try {
Configuration cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
//List<String> list = new ArrayList<String>();
User u = new User();
u.setUsername("挖发发火");
u.getAddressMap().put("A1", "上海");
u.getAddressMap().put("A2", "背景");
session.save(u);
//u.getAddress().add("海南1");
//u.getAddress().add("北京1");
tx.commit();
}catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
session.close();
sessionFactory.close();
}
}
}
list映射:
步骤一:同上,实体类对象中address用List集合存储
步骤二:配置User.hbm.xml映射表 list集合有序,所以这里比set集合多了个<list-index>
List集合属性的映射
name指定要映射的list集合的属性
table集合属性要映射的表
key指定集合表(t_addressList)的外键字段
element指定集合表的其他字段
type元素类型,一定要指定
list-index是list集合一定要指定的,指定排序列的名称,因为list是有序的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="list.User" table="table_userInform" dynamic-insert="true" dynamic-update="true">
<id name="id" column="user_id" type="java.lang.Integer"> <!--配置主键-->
<generator class="native"></generator> <!-- 主键自增长方式(根据数据库自动匹配)-->
</id>
<property name="username" type="java.lang.String" ></property>
<list name="address" table="t_address">
<!-- 设置外键 -->
<key column="Aid"></key>
<list-index column="list_order"></list-index>
<element column="address" type="java.lang.String"></element>
</list>
</class>
</hibernate-mapping>
步骤三:配置hibernate.cfg.xml,同上。(此处省略)
步骤四:测试
package com.test;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import list.User;
public class TestList {
@Test
public void testList() {
Transaction tx = null;
SessionFactory sessionFactory = null;
Session session = null;
try {
Configuration cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
List<String> list = new ArrayList<String>();
User u = new User();
u.setUsername("挖发发火");
list.add("海南");
list.add("北京");
u.setAddress(list);
session.save(u);
tx.commit();
}catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
session.close();
sessionFactory.close();
}
}
}
map集合映射
步骤一:同上,实体类对象中address用Map集合存储
步骤二:配置User.hbm.xml映射表
Map映射
name指定要映射的map集合的属性
table集合属性要映射的表
key指定集合表(t_addressMap)的外键字段
element指定集合map的其他字段value
type元素类型,一定要指定
map-key指定map的key
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="map.User" table="table_userInform" dynamic-insert="true" dynamic-update="true">
<id name="id" column="user_id" type="java.lang.Integer"> <!--配置主键-->
<generator class="native"></generator> <!-- 主键自增长方式(根据数据库自动匹配)-->
</id>
<property name="username" type="java.lang.String" ></property>
<map name="addressMap" table="t_addressMap">
<!-- 外键 -->
<key column="uid"></key>
<map-key type="java.lang.String" column="shortName"></map-key>
<element column="addressMap" type="java.lang.String"></element>
</map>
</class>
</hibernate-mapping>
步骤三:配置hibernate.cfg.xml,同上。(此处省略)
步骤四:测试
package com.test;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import map.User;
public class TestMap {
@Test
public void testMap() {
Transaction tx = null;
SessionFactory sessionFactory = null;
Session session = null;
try {
Configuration cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
//List<String> list = new ArrayList<String>();
User u = new User();
u.setUsername("挖发发火");
u.getAddressMap().put("A1", "上海");
u.getAddressMap().put("A2", "背景");
session.save(u);
tx.commit();
}catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
session.close();
sessionFactory.close();
}
}
}
结果:
数组映射
步骤一:
步骤二:配置User.hbm.xml映射表
步骤三:配置hibernate.cfg.xml,同上。(此处省略)
步骤四:测试
最后说明一下:
如果在JavaBean即实体类已经实例化了集合对象,如private List<String> address = new ArrayList<>();
则可以
User u = new User();
u.getAddress().add("海南");
u.getAddress().add("北京");
session.save(u);
如果在JavaBean内没有实例化集合对象,如private List<String> address = null;
但需要在添加属性时新建一个序列
* List<String> list = new ArrayList<String>();
* list.add("海南");
* list.add("北京");
* u.setAddress(list);
session.save(u);