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

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

依旧新建一个StudentList.java实体类,其他的属性不变,只是将hobby属性由Set集合类型变为List集合类型,还是把代码贴出来吧,希望不要嫌烦

packagecom.joe.entity;importjava.util.List;public classStudentList {private intid;privateString name;private intage;private Listhobby;/*** 无参构造函数*/

publicStudentList(){

}public intgetId() {returnid;

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

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

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

}public ListgetHobby() {returnhobby;

}public void setHobby(Listhobby) {this.hobby =hobby;

}

}

接下来,大家都知道的,就是配置StudentList.hbm.xml对象关系映射文件了,先说说标签吧,元素用来映射java.util.List类型的属性,常用的属性和子元素有:

name属性

table属性

子元素

子元素

子元素

照样贴上代码:

来解读一下list标签吧,子元素和子元素就不多讲了,主要是子元素,我查了一下资料,也可以使用,因List集合是个有序可重复的集合,所以要使用(或者使用) 来标明其顺序。(position为hobby_list_tab表中附加字段),因此在插入更新时便需要维护position字段,否则索引设置错误,取出的数据就会出现空值情况。

如果标签配置了inverse="true"属性, 则list的index则不会主动赋值,index列会产生空值,如果index列数据库设置可以为空,则可以正常保存数据. 而用hibernate再去查询对象数据时,会抛出null index column for collection: 此类错误.也就是说配置inverse为true的list,需要手动维护index列.感觉还是挺复杂的,有点儿搅。

当然,还可以使用(结合了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的执行结果:

f5446817178e4efcaafe37bac1e4deb5.png

在创建hobby_list_tab表的时候,可以看到position字段配置来not null 属性,这也体现来前面的list标签的配置,更多的信息可以在其官方文档了解,这里提供一个快捷通道:点击这里

add()方法的测试:

/*** 添加的方法*/@Testpublic voidadd(){

Transaction tx=null;

Session session=null;try{

session=HibernateUtils.getSession();

tx=session.beginTransaction();

StudentList student=newStudentList();

student.setName("zhangsan");

student.setAge(20);

List list=new ArrayList();

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

}

}

执行该方法,看看控制台的输出信息:

2032e53d5f3f5f5e22e7f897482c97e2.png

只有一点需要说明的,就是我在程序中并没有为position肤质,那position字段中是否有值,如果有,为何值?打开mysql数据库,一看便知:

a4034379129e8a2b9f0334e82562e1bb.png

哎,有值,这是hibernate提供的一种机制,它自动维护,只要你配置正确。还有一个问题需要注意,就是为什么是从0开始的而不是其他的值开始的呢?这就和我们的List集合相关联,List的底层是一个动态的数组,所以添加元素时,下标是从0开始的。

findAll()方法的测试:

@Testpublic voidfindAll(){

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表的,还是贴上图吧:

3b49a09a16f8eba63e8fe0f3e4d606e1.png

接下来,添加访问hobby属性的代码:

//访问hobby属性

List hobby=stu.getHobby();for(String str:hobby){

System.out.println(str);

}

相信结果大家还是知道的,依旧贴图:

2ca75d794d25c6a9167495e5930111a3.png

其实自我感觉这篇文章和上一篇文章有点重复,但是还不至于无聊致死,毕竟知识是一步一步学来的,接下来的一两篇,节奏大概还是这样的吧,各位看官,不要嫌我啰嗦哟。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值