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;

扫描二维码关注公众号,回复: 6112367 查看本文章

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);

http://www.cnblogs.com/biehongli/p/6555994.html

猜你喜欢

转载自blog.csdn.net/F13253524870/article/details/89341761