先说一段废话吧,本打算每天把所学的知识总结为博客的,但是昨天为什么没有写呢?没有学习吗?No,那是为什么?贪玩,对,这位同学说对了,老实说昨天感觉身体不怎么舒服,大家都知道,这其实就是为自己懒找借口,好吧,废话先唠到这儿,下面进入正题。


先说说概念吧

在持久化类中,有时会使用到值类型的对象属性,所谓值类型的对象,是指它对应的类没有对象标识符属性,也就是我们在前面所说的OID,只能作为一个持久化类的属性使用。如果持久化类中一个值类型的集合,那么就需要一张额外的数据库表来保存这个值类型集合的数据,这张表被称为集合表。

需要注意的一点是,hibernate3.0以后开始支持大部分重要的JDK集合接口映射,当然,现在的开发基本上都是使用3.0以后的版本吧,

为此,我们在项目中新建一个实体类吧,我取名StudentSet.java,给它简单地赋予几个属性,其中比较特别的属性就是hoppy属性,它是一个Set集合类型的,表现为一多关系:

package com.joe.entity;

import java.util.Set;

/**
*
* @author Joe
* StudentSet java bean
*/
public class StudentSet { private int id;
private String name;
private int age;
private Set<String> hobby; /**
* 无参的构造函数
*/
public StudentSet(){ } 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 Set<String> getHobby() {
return hobby;
}
public void setHobby(Set<String> hobby) {
this.hobby = hobby;
} }

在配置实体关心映射文件的时候,要特别注意对于set标签的配置:<set>元素用来映射java.util.Set类型的属性,常用的属性和子元素有:

  1. name属性:对应实体类中Set集合属性
  2. table属性:当前Set集合所对应的表结构
  3. <key>子元素:Set集合对应的表结构的外键列
  4. <element>子元素:保存集合中所存贮的数据
<?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.StudentSet" table="stu_set_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> <set name="hobby" table="hobby_tab">
<key column="student_id"></key>
<element type="string" column="hobby"></element>
</set> </class>
</hibernate-mapping>

其中key是hobby_tab的外键,element元素标签是映射到数据库中的集合的字段,另外,一定要为element标签设置type属性,否则是会抛异常的。编写好了过后,不要忘了在hibernate.cfg.xml文件中添加映射,接下来,在test文件夹下的测试包中新建一个StudentSetTest.java测试类,在该类下,先添加下面的方法:

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

这个方法就不介绍了,执行该方法,看看hibernate都做了些什么?

可以发现,除了创建stu_set_tab表以外,还创建了一张名为hobby_tab的表,并且把student_id设置为hobby_tab的外键。

测试添加

紧跟上面的步伐,添加一个add()方法:

/**
* 添加的方法
*/
@Test
public void add(){
Transaction tx=null;
Session session=null;
try{
session=HibernateUtils.getSession();
tx=session.beginTransaction();
StudentSet student=new StudentSet();
student.setName("zhangsan");
student.setAge(20); @SuppressWarnings({ "rawtypes", "unchecked" })
Set<String> set=new HashSet();
set.add("basketball");
set.add("swimming"); student.setHobby(set); session.save(student); tx.commit();
}catch(HibernateException he){
if(tx!=null){
tx.rollback();
}
he.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}

调用session的save()方法,测试该方法,在看看hibernate又为我们做了什么?

有点可惜,屏幕不够大,看不完整,但思路是完整的,这几句sql还是好理解的,就是简单的插入操作,不再多言。

get()方法

这个测试更有趣一点:

/**
* 查询方法
*/
@Test
public void findAll(){
Transaction tx=null;
Session session=null;
try{
session=HibernateUtils.getSession();
tx=session.beginTransaction(); StudentSet stu=(StudentSet)session.get(StudentSet.class, 1);
System.out.println(stu.getId()+stu.getName()+stu.getAge()); tx.commit();
}catch(HibernateException he){
if(tx!=null){
tx.rollback();
}
he.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}

在次测试,看看控制台的输出信息:

咦,为什么没有查询hobby_tab表呢?从上面的程序代码中,我们并没有访问hobby属性,改进程序代码,添加访问hobby属性的代码:

//访问hobby属性
Set<String> hobby=stu.getHobby();
for(String str:hobby){
System.out.println(str);
}

再次测试,结果应该都能猜到的,

如我们所料,hibernate执行了两条sql语句。先根据id查询学习的基本信息,再根据id在hobby_tab中查询对应的数据。前面不是说过了吗?只有访问对象的非对象表示符(OID)属性的时候,才会发起select语句,体现了hibernate的延迟加载、懒加载的特性。

好吧,把昨天的博客补上了,稍稍有点简陋,当然还有很多没有总结到的,也还有很多需要修正的,希望园子里的大神们可以给我提些意见和建议。

hibernate学习系列-----(6)hibernate对集合属性的操作之Set集合篇的更多相关文章

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

    照旧,先新建一个StudentMap.java实体类,将hobby属性使用map集合接口来存放: package com.joe.entity; import java.util.Map; publi ...

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

    今天要写的内容其实不多,本打算将hibernate对集合的操作的内容直接归结为一篇的,但想一想,还是分开写的比较好,毕竟前面的已经发布出去来了,废话不多说,开始吧! 依旧新建一个StudentList ...

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

    度过短暂的周末,又到了周一,继续轻松而愉快的学习,紧承以前的学习,继续了解hibernate对集合的操作学习之旅! 在上一篇中,就已经提前说过,这一篇的内容以及下一篇的内容会有很多相似之处,这里就不再 ...

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

    在上一篇文章hibernate学习系列-----(1)开发环境搭建中,大致总结了hibernate的开发环境的搭建步骤,今天,我们继续了解有关hibernate的知识,先说说这篇文章的主要内容吧: C ...

  5. Hibernate学习一:Hibernate注解CascadeType

    http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hi ...

  6. redis:order set有序集合类型的操作(有序集合)

    1. order set有序集合类型的操作(有序集合) 有序集合是在无序集合的基础上加了一个排序的依据,这个排序依据叫score,因此声明一个集合为有序集合的时候要加上score(作为排序的依据) 1 ...

  7. redis:set集合类型的操作(无序集合)

    1. set集合类型的操作(无序集合) 集合具有无序性(没有顺序).确定性(描述是确定的).唯一性(没有重复的元素) 1.1. sadd key member [member ...] 语法:sadd ...

  8. Hibernate对集合属性的操作---基础学习

    1:Set集合属性操作 1).Hibernate3以后支持大部分重要的JDK集合接口映射,Set集合接口的配置:  >在xxx.hbm.xml文件中使用<set>标签 2).< ...

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

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

随机推荐

  1. python之八大排序方法

    一.插入排序 #-*- coding:utf-8 -*- ''' 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时 ...

  2. k8s的chart学习(下)

    1.开发自己的chart Kubernetes 给我们提供了大量官方 chart,不过要部署微服务应用,还是需要开发自己的 chart,下面就来实践这个主题. 1.1创建 chart 执行 helm ...

  3. CentOS7 中把默认yum源更换成163源

    163源是目前国内最好用的源,速度是相当快的,现在我们把CentOS7中的源改为163源 1.进入yum源配置文件 cd /etc/yum.repos.d 2.备份一下当前的源,以防出错后可以还原回来 ...

  4. thinkphp5.0配置nginx重写规则

    我的centeros7.3系统,单主机实例: vi /usr/local/nginx/conf/nginx.conf 在如图红框位置加入以下代码(图片是截取的,截取部分上方还有其他的默认配置代码,代码 ...

  5. Fedora27安装宝塔linux面板出现/usr/lib/rpm/redhat/redhat-hardened-cc1找不到的错误

    执行下面的命令: sudo dnf install redhat-rpm-config 就可以解决你的问题了

  6. Codeforces 1023 B.Pair of Toys (Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Fi)

    B. Pair of Toys 智障题目(嘤嘤嘤~) 代码: 1 //B 2 #include<iostream> 3 #include<cstdio> 4 #include& ...

  7. UVA 699 The Falling Leaves (递归先序建立二叉树)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/19244 #include <iostream> #include <cstdio> # ...

  8. 17、Flask实战第17天:Flask-cookie

    cookie的基本概念 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接并且登录成功后,第二次请求服务器依然不能知道当前请求的是哪个用户. cookie的出现就是为了解决这个问题,第一 ...

  9. sqlldr Field in data file exceeds maximum length "

    使用sqlldr导数时出现如下错误: " Record 1: Rejected - Error on table PC_PLANNAME, column PLANNAME.Field in ...

  10. [BZOJ 1145] 图腾totem

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1145 Solution: 算是一道神题了吧 设 f(abcd)为:当选出的四个数相对大小 ...