hibernate学习系列-----(8)hibernate对集合属性的操作之Collectioon集合篇
度过短暂的周末,又到了周一,继续轻松而愉快的学习,紧承以前的学习,继续了解hibernate对集合的操作学习之旅!
在上一篇中,就已经提前说过,这一篇的内容以及下一篇的内容会有很多相似之处,这里就不再多言了。像往常一样,新建一个StudentCollection.java实体类:
package com.joe.entity;
import java.util.Collection;
public class StudentCollection {
private int id;
private String name;
private int age;
private Collection<String> hobby;
/**
* 无参构造
*/
public StudentCollection(){
}
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 Collection<String> getHobby() {
return hobby;
}
public void setHobby(Collection<String> hobby) {
this.hobby = hobby;
}
}
在StudentCollection.hbm.xml实体关系映射文件配置Colllection的时候,有两种不同的配置(<bag>或<idbag>元素),照例先看看有哪些常用的属性和子元素吧,<bag>或<idbag>元素用来映射java.util.Collection类型的属性,常用的属性和子元素有:
- name属性
- table属性
- <collection-id>子元素,对应<idbag>
- <key>子元素
- <element>子元素
先看看一般比较常见的配置,也就是使用<idbag>进行配置:
<?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.StudentCollection" table="stu_collect_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>
<!-- 使用idbag标签配置映射 -->
<idbag name="hobby" table="hobby_collect_tab">
<collection-id type="string" column="hobby_id">
<generator class="uuid"></generator>
</collection-id>
<key column="student_id"></key>
<element type="string" column="hobby"></element>
</idbag> </class>
</hibernate-mapping>
另一种使用<bag>标签来配置映射关系的代码:
<!-- 使用bag标签配置映射 -->
<bag name="hobby" table="hobby_collect_tab">
<key column="student_id"></key>
<element type="string" column="hobby"></element>
</bag>
关于两者的不同,我会在测试类中分析,先看看两种配置生成的表结构吧:
使用<idbag>配置生成的表结构:

而使用<bag>标签进行配置的时候,生成的表结构又是什么样的呢?

可以发现,对比使用两种不同的方式创建的表结构,不难发现在使用<idbag>方式创建表结构的时候会增加一个额外的字段来维护表中的数据,单从这一点上就可以发现两者的不同。
当我们删除其中的某一个对象的一个hobby时,看看hibernate执行的操作:
@Test
public void findAll(){
Transaction tx=null;
Session session=null;
try{
session=HibernateUtils.getSession();
tx=session.beginTransaction();
StudentCollection stu=(StudentCollection)session.get(StudentCollection.class, 1);
System.out.println(stu.getName()+stu.getAge()+stu.getId()); Collection<String> c=stu.getHobby();
c.remove("swimming"); tx.commit();
}catch(HibernateException he){
if(tx!=null){
tx.rollback();
}
he.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
测试该方法,使用<bag>标签配置的情况是:


使用<idbag>进行配置的时候,结果是:

查询基本信息的时候,没有什么差别,关键是后面删除操作,对比两种方式,可以发现,使用<bag>方式配置的时候,hibernate采用的方式 是先获取对用student_id的所有hobby,然后全部删除,然后再session提交事务的时候,根据session管理的对象中数据差异将collection集合中的数据重新插入数据库;使用<idbag>方式配置时只会根据hobby_id的值去删除对应的数据,通过对比可以发现,使用<idbag>方式进行配置时会更合理,也会提高业务处理的效率,所以一般会使用<idbag>方式来配置。
hibernate学习系列-----(8)hibernate对集合属性的操作之Collectioon集合篇的更多相关文章
- hibernate学习系列-----(9)hibernate对集合属性的操作之Map集合篇
照旧,先新建一个StudentMap.java实体类,将hobby属性使用map集合接口来存放: package com.joe.entity; import java.util.Map; publi ...
- hibernate学习系列-----(6)hibernate对集合属性的操作之Set集合篇
先说一段废话吧,本打算每天把所学的知识总结为博客的,但是昨天为什么没有写呢?没有学习吗?No,那是为什么?贪玩,对,这位同学说对了,老实说昨天感觉身体不怎么舒服,大家都知道,这其实就是为自己懒找借口, ...
- hibernate学习系列-----(7)hibernate对集合属性的操作之List集合篇
今天要写的内容其实不多,本打算将hibernate对集合的操作的内容直接归结为一篇的,但想一想,还是分开写的比较好,毕竟前面的已经发布出去来了,废话不多说,开始吧! 依旧新建一个StudentList ...
- hibernate学习系列-----(2)hibernate核心接口和工作机制
在上一篇文章hibernate学习系列-----(1)开发环境搭建中,大致总结了hibernate的开发环境的搭建步骤,今天,我们继续了解有关hibernate的知识,先说说这篇文章的主要内容吧: C ...
- Hibernate学习一:Hibernate注解CascadeType
http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hi ...
- redis:order set有序集合类型的操作(有序集合)
1. order set有序集合类型的操作(有序集合) 有序集合是在无序集合的基础上加了一个排序的依据,这个排序依据叫score,因此声明一个集合为有序集合的时候要加上score(作为排序的依据) 1 ...
- redis:set集合类型的操作(无序集合)
1. set集合类型的操作(无序集合) 集合具有无序性(没有顺序).确定性(描述是确定的).唯一性(没有重复的元素) 1.1. sadd key member [member ...] 语法:sadd ...
- Hibernate对集合属性的操作---基础学习
1:Set集合属性操作 1).Hibernate3以后支持大部分重要的JDK集合接口映射,Set集合接口的配置: >在xxx.hbm.xml文件中使用<set>标签 2).< ...
- [原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- [ Python -1 ] 简易购物车程序
练习: 1. 要求用户输入总资产,例如:2000 2. 显示商品列表,让用户根据序号选择商品,加入购物车 3. 购买,如果商品总额大于总资产,提示账户余额不足,否则,购买成功. goods = [{' ...
- import详解
试想一下 在工作中今年在一个项目中可能会导入某一个目录下的模块文件,那这个时候怎么样才能让Python解释器能够找到该模块进行调用呢? - 将这个模块拷贝一份到当前使用目录下. 这种方式让模块太冗余 ...
- processEngine.getRuntimeService().createProcessInstanceQuery().processInstanceId(“ 132501”).active().singleResult();
JAVA: processEngine.getRuntimeService().createProcessInstanceQuery().processInstanceId(“ 132501”).ac ...
- 变量与指针 --- WalMart 寄存箱设计者不懂计算机
一.场景: 今天星期天,难得公司售后同事很给力,项目运行正常,无运维事务需要处理.于是满足堂客(湖南人称老婆)很久来的心愿 陪其逛街(这里要惭愧 检讨作为IT码农常常容易忽略身边的人.大声疾呼:“码农 ...
- linux基础学习目录
以下用一个表格来罗列linux默认的目录或文件及其用途: 目录/文件 用途 来源 / /处于Linux文件系统树形结构的最顶端,它是Linux文件系统的入口,所有的目录.文件.设备都在/之下. - / ...
- 【Linux命令】du -h --max-depth=1 /usr/local/
查看文件夹中各文件(夹)的大小 例如 du -h --max-depth=1 /usr/local/ 应用:比如mysql 无法启动,提示:ERROR! Manager of pid-file qui ...
- (2)创建发布Maven
一.创建maven项目 (1)命令行 mvn archetype:generate (2)选择模板默认是7 (3)输入组织号.项目名称及版本号.包名 回车确认 创建成功 二.转成idea项目 进入跟目 ...
- HDU 2280 Tetris Comes Back
状态压缩,$dp$,预处理. 设$dp[i][j]$为前$i-1$行填满,第$i$行为状态$j$的最小需要$1$种类的数量.预处理好每种状态能推出哪些状态,并且记录下所需花费就可以了. #pragma ...
- POJ 1722 SUBTRACT
给定一个数组a[1,2,..,n] .定义数组第i位上的减操作:把ai和ai+1换成ai - ai+1.输入一个n位数组以及目标整数t,求一个n-1次操作序列,使得最后剩下的数等于t最后输出依此操作的 ...
- Codeforces Round 252 (Div. 2)
layout: post title: Codeforces Round 252 (Div. 2) author: "luowentaoaa" catalog: true tags ...