hibernate学习系列-----(7)hibernate对集合属性的操作之List集合篇
今天要写的内容其实不多,本打算将hibernate对集合的操作的内容直接归结为一篇的,但想一想,还是分开写的比较好,毕竟前面的已经发布出去来了,废话不多说,开始吧!
依旧新建一个StudentList.java实体类,其他的属性不变,只是将hobby属性由Set集合类型变为List集合类型,还是把代码贴出来吧,希望不要嫌烦
package com.joe.entity; import java.util.List; public class StudentList { private int id;
private String name;
private int age; private List<String> hobby; /**
* 无参构造函数
*/
public StudentList(){ } 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 List<String> getHobby() {
return hobby;
} public void setHobby(List<String> hobby) {
this.hobby = hobby;
} }
接下来,大家都知道的,就是配置StudentList.hbm.xml对象关系映射文件了,先说说<list>标签吧,<list>元素用来映射java.util.List类型的属性,常用的属性和子元素有:
- name属性
- table属性
- <key>子元素
- <list-index>子元素
- <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.StudentList" table="stu_list_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> <list name="hobby" table="hobby_list_tab">
<key column="student_id"></key>
<list-index column="position"></list-index>
<element type="string" column="hobby"></element>
</list> </class>
</hibernate-mapping>
来解读一下list标签吧,<key>子元素和<element>子元素就不多讲了,主要是<list-index>子元素,我查了一下资料,也可以使用<index>,因List集合是个有序可重复的集合,所以要使用<index-index column="position"/></list-index>(或者使用<index column="position"></index>) 来标明其顺序。(position为hobby_list_tab表中附加字段),因此在插入更新时便需要维护position字段,否则索引设置错误,取出的数据就会出现空值情况。
如果<list>标签配置了inverse="true"属性, 则list的index则不会主动赋值,index列会产生空值,如果index列数据库设置可以为空,则可以正常保存数据. 而用hibernate再去查询对象数据时,会抛出null index column for collection: 此类错误.也就是说配置inverse为true的list,需要手动维护index列.感觉还是挺复杂的,有点儿搅。
当然,还可以使用<bag>(结合了List与Set)标签来配置list集合属性,可以重复且没有顺序的一种集合,是Hibernate提供的。HIbernate使用jdk的List模拟Bag。其配置与Hibernate映射list时基本相同。这里就不再讨论来,毕竟这是是冲着list来的。
依旧建立一个StudentListTest.java测试类,先写一个创建表结构的方法:
@Test
public void createTable() {
Configuration cfg = new Configuration().configure();
SchemaExport se = new SchemaExport(cfg);
se.create(true, true);
}
执行该方法,看看hibernate的执行结果:
在创建hobby_list_tab表的时候,可以看到position字段配置来not null 属性,这也体现来前面的list标签的配置,更多的信息可以在其官方文档了解,这里提供一个快捷通道:点击这里
add()方法的测试:
/**
* 添加的方法
*/
@Test
public void add(){
Transaction tx=null;
Session session=null;
try{
session=HibernateUtils.getSession();
tx=session.beginTransaction();
StudentList student=new StudentList();
student.setName("zhangsan");
student.setAge(20); List<String> list=new ArrayList<String>();
list.add("basketball");
list.add("swimming"); student.setHobby(list); session.save(student); tx.commit();
}catch(HibernateException he){
if(tx!=null){
tx.rollback();
}
he.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
执行该方法,看看控制台的输出信息:
只有一点需要说明的,就是我在程序中并没有为position肤质,那position字段中是否有值,如果有,为何值?打开mysql数据库,一看便知:
哎,有值,这是hibernate提供的一种机制,它自动维护,只要你配置正确。还有一个问题需要注意,就是为什么是从0开始的而不是其他的值开始的呢?这就和我们的List集合相关联,List的底层是一个动态的数组,所以添加元素时,下标是从0开始的。
findAll()方法的测试:
@Test
public void findAll(){
Transaction tx=null;
Session session=null;
try{
session=HibernateUtils.getSession();
tx=session.beginTransaction(); StudentList stu=(StudentList)session.get(StudentList.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);
}
}
和以前测试差不多,先只访问基本属性,我想hibernate的执行动作大家都知道了,只会有一条select语句,不会去访问hobby_list_tab表的,还是贴上图吧:
接下来,添加访问hobby属性的代码:
//访问hobby属性
List<String> hobby=stu.getHobby();
for(String str:hobby){
System.out.println(str);
}
相信结果大家还是知道的,依旧贴图:
其实自我感觉这篇文章和上一篇文章有点重复,但是还不至于无聊致死,毕竟知识是一步一步学来的,接下来的一两篇,节奏大概还是这样的吧,各位看官,不要嫌我啰嗦哟。
hibernate学习系列-----(7)hibernate对集合属性的操作之List集合篇的更多相关文章
- hibernate学习系列-----(9)hibernate对集合属性的操作之Map集合篇
照旧,先新建一个StudentMap.java实体类,将hobby属性使用map集合接口来存放: package com.joe.entity; import java.util.Map; publi ...
- hibernate学习系列-----(6)hibernate对集合属性的操作之Set集合篇
先说一段废话吧,本打算每天把所学的知识总结为博客的,但是昨天为什么没有写呢?没有学习吗?No,那是为什么?贪玩,对,这位同学说对了,老实说昨天感觉身体不怎么舒服,大家都知道,这其实就是为自己懒找借口, ...
- hibernate学习系列-----(8)hibernate对集合属性的操作之Collectioon集合篇
度过短暂的周末,又到了周一,继续轻松而愉快的学习,紧承以前的学习,继续了解hibernate对集合的操作学习之旅! 在上一篇中,就已经提前说过,这一篇的内容以及下一篇的内容会有很多相似之处,这里就不再 ...
- 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 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- 【 Keepalived 】Nginx or Http 主-主模式
上一篇:[ Keepalived ]Nginx or Http 主-备模式 在此基础上进行修改并实现 Keepalived主-主模式 首先,需要理解的是:主-备模式是一个VIP在工作,主-主模式则需要 ...
- (21)python Anaconda
1.安装 Anaconda下载镜像 --官网下载太慢 https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ 下载安装后 2.添加第三方源 管 ...
- Ubuntu 安装 tensorflow-gpu + keras
转载请注明: 仰望大牛的小清新:http://www.cnblogs.com/luruiyuan/ 本文原网址:http://www.cnblogs.com/luruiyuan/p/6660142.h ...
- P3197越狱
花费了好长时间,终于刷掉了这道题. 题目在这里(洛谷) (信息学奥赛一本通) 嗯,没错,这是一道快速幂的题,不会快速幂点这里 好现在开始分析,这道题用小学奥数的思想就可以想到,直接算有多少种可能比较 ...
- n2n搭建手记-1-V1
搭建环境 supernode :阿里云主机一台 aly1(Centos 6.5) edg2node:美团云机器两台 mty1,mty2(Centos 7.0) Step-1 各机器安装subviers ...
- 【记忆化搜索】bzoj3208 花神的秒题计划Ⅰ
暴力 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #de ...
- 【Splay】【块状链表】bzoj3223 Tyvj 1729 文艺平衡树
让蒟蒻见识到了常数大+滥用STL的危害. <法一>很久之前的Splay #include<cstdio> #include<algorithm> using nam ...
- Java概述--Java开发实战经典
1)Java有三个发展方向,分别是Java SE,Java EE,Java ME.以下简要介绍. a.Java SE,Java Standard Edition(java标准版),包含了构成java语 ...
- Java矩阵库—jblas、ujmp、jmatio的相互转化
1)首先使用jmatio(v0.2)从.mat文件读取数据到内存中,并将其转化为二维数组的形式. import com.jmatio.io.MatFileReader; import com.jmat ...
- 学习Microsoft SQL Server 2008技术内幕:T-SQL语法基础
第 2 章: 单表查询 use TSQLFundamentals2008; select * from Sales.orders; select empid, year(orderdate) as o ...