hibernate学习系列-----(9)hibernate对集合属性的操作之Map集合篇

照旧,先新建一个StudentMap.java实体类,将hobby属性使用map集合接口来存放:

package com.joe.entity;

import java.util.Map;

public class StudentMap {

    private int id;
    private String name;
    private int age;
    private Map<String,String> hobby;

    /**
     * 无参构造函数
     */
    public StudentMap(){

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Map<String, String> getHobby() {
        return hobby;
    }

    public void setHobby(Map<String, String> hobby) {
        this.hobby = hobby;
    }

}

接下来就是配置对象关系映射文件了,在hibernate中可以使用<map>标签来配置,先了解一下<map>标签的常见属性及子元素吧:<map>元素用来映射java.util.Map类型的属性,常用的属性和子元素有:

  1. name属性
  2. table属性
  3. <key>子元素
  4. <map-key>子元素
  5. <element>子元素

在java中,map集合接口存放数据是采用键值对的形式,因此<map-key>就是来map的键的,因此它也需要额外的列来保存键值。StudentMap.hbm.xml中的内容是:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
    <!-- 一个class标签对应一个实体类,name属性指定实体类名称,table属性指定关联的数据库表 -->
    <class name="com.joe.entity.StudentMap" table="stu_map_tab">
        <!-- 主键 -->
        <id name="id" column="stu_id">
            <!-- 提供ID自增的策略  native会根据数据库自行判断 -->
            <generator class="native"></generator>
        </id>
        <!-- 其他属性,name对应实体类的属性,column对应关系型数据库表的列 -->
        <property name="name" column="stu_name"></property>
        <property name="age" column="stu_age"></property>

        <map name="hobby" table="hobby_map_tab">
            <key column="student_id"></key>
            <map-key column="keycolumn" type="string"></map-key>
            <element type="string" column="hobby"></element>
        </map>

    </class>
</hibernate-mapping>

最后贴上StudentMapTest.java类的代码吧,这个测试和以前的几篇文章中的测试无异,就不在一个一个地展示了:

package com.joe.test;

import java.util.HashMap;
import java.util.Map;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;

import com.joe.entity.StudentMap;
import com.joe.util.HibernateUtils;

public class StudentMapTest {

    @Test
    public void createTable() {
        Configuration cfg = new Configuration().configure();
        SchemaExport se = new SchemaExport(cfg);
        se.create(true, true);
    }

    @Test
    public void save(){
        Transaction tx=null;
        Session session=null;
        try{
            session=HibernateUtils.getSession();
            tx=session.beginTransaction();

            StudentMap stu=new StudentMap();
            stu.setName("wangwu");
            stu.setAge(20);

            @SuppressWarnings({ "unchecked", "rawtypes" })
            Map<String,String> map=new HashMap();
            map.put("a", "run");
            map.put("b", "eat");

            stu.setHobby(map);

            session.save(stu);

            tx.commit();
        }catch(HibernateException he){
            if(tx!=null){
                tx.rollback();
            }
            he.printStackTrace();
        }finally{
            HibernateUtils.closeSession(session);
        }
    }

    @Test
    public void findAll(){
        Transaction tx=null;
        Session session=null;
        try{
            session=HibernateUtils.getSession();
            tx=session.beginTransaction();

            StudentMap stu=(StudentMap)session.get(StudentMap.class, 1);
            System.out.println(stu.getId()+stu.getName()+stu.getAge());

            Map<String,String > map=stu.getHobby();
            System.out.println(map);
            tx.commit();
        }catch(HibernateException he){
            if(tx!=null){
                tx.rollback();
            }
            he.printStackTrace();
        }finally{
            HibernateUtils.closeSession(session);
        }
    }

}

hibernate对集合的操作就写到这儿了,其实还有很多没有写到的,如果有大神看过我的文章,希望多多指点,最后,关于java集合的学习,我在园子里看到有园友写过一个系列,感觉写得非常好,建议大家看看,Java 集合系列目录(Category)

时间: 2024-10-01 05:27:55

hibernate学习系列-----(9)hibernate对集合属性的操作之Map集合篇的相关文章

hibernate学习系列-----(6)hibernate对集合属性的操作之Set集合篇

先说一段废话吧,本打算每天把所学的知识总结为博客的,但是昨天为什么没有写呢?没有学习吗?No,那是为什么?贪玩,对,这位同学说对了,老实说昨天感觉身体不怎么舒服,大家都知道,这其实就是为自己懒找借口,好吧,废话先唠到这儿,下面进入正题. 先说说概念吧 在持久化类中,有时会使用到值类型的对象属性,所谓值类型的对象,是指它对应的类没有对象标识符属性,也就是我们在前面所说的OID,只能作为一个持久化类的属性使用.如果持久化类中一个值类型的集合,那么就需要一张额外的数据库表来保存这个值类型集合的数据,这

hibernate学习系列-----(7)hibernate对集合属性的操作之List集合篇

今天要写的内容其实不多,本打算将hibernate对集合的操作的内容直接归结为一篇的,但想一想,还是分开写的比较好,毕竟前面的已经发布出去来了,废话不多说,开始吧! 依旧新建一个StudentList.java实体类,其他的属性不变,只是将hobby属性由Set集合类型变为List集合类型,还是把代码贴出来吧,希望不要嫌烦 package com.joe.entity; import java.util.List; public class StudentList { private int i

hibernate学习系列-----(8)hibernate对集合属性的操作之Collectioon集合篇

度过短暂的周末,又到了周一,继续轻松而愉快的学习,紧承以前的学习,继续了解hibernate对集合的操作学习之旅! 在上一篇中,就已经提前说过,这一篇的内容以及下一篇的内容会有很多相似之处,这里就不再多言了.像往常一样,新建一个StudentCollection.java实体类: package com.joe.entity; import java.util.Collection; public class StudentCollection { private int id; private

hibernate学习系列-----(2)hibernate核心接口和工作机制

在上一篇文章hibernate学习系列-----(1)开发环境搭建中,大致总结了hibernate的开发环境的搭建步骤,今天,我们继续了解有关hibernate的知识,先说说这篇文章的主要内容吧: Configuration类 SessionFactory接口 Session接口 Transaction接口 Query和Criteria接口 下面就进行分类别地详细说明: Configuration类 功能描述:Configuration类负责管理Hibernate的配置信息作并根据配置信息启动H

Hibernate学习一:Hibernate注解CascadeType

http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hibernate学习一:Hibernate注解CascadeType 博客分类: Hibernate hibernate 一.概念 现有一场景:一个管理员可以管理多个网吧,一个网吧可以被多个管理员管理.从中抽象出一个多对多的例子user-bar. 主控方user:多对多里面里面会有第三张表user_b

Hibernate学习笔记(2)Hibernate问题

(1)数据库驱动问题 log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Exception in thread "main" org.hibernate.HibernateException: JDBC Driver class not found: com.m

set集合类型的操作(无序集合)——redis

1. set集合类型的操作(无序集合) 集合具有无序性(没有顺序).确定性(描述是确定的).唯一性(没有重复的元素) 1.1. sadd key member [member ...] 语法:sadd key member [member ...] 作用:往集合key中添加元素 返回值:添加元素的个数 例: 127.0.0.1:6379> sadd fruit apple banana pear (integer) 3 127.0.0.1:6379> sadd num 1 1 (integer

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

hibernate学习系列-----(4)hibernate基本查询上篇:HQL基本查询

紧接着上一篇,今天继续hibernate的学习总结,来聊一聊hibernate的基本查询方法,先说说HQL(hibernate Query Language):它是官方推荐的查询语言.在开始写代码之前,看看需要做哪些准备工作吧,首先,在我们的学生类中新增一个属性"clazz",其实不加也可以,接着,我们需要重写Student.java类中的toString()方法,代码如下: /** * 重写toString方法 */ @Override public String toString(