`

Hibernate配置Set和List

阅读更多
========================Set==============================

这个方法和之前map说的基本一样。
http://alleni123.iteye.com/admin/blogs/1979726
不需要配置Student.hbm.xml, 只要创建一个没有属性的Student.java


Team.java
public class Team
{
	private String id;
	
	private String name;
	
	private Set students=new HashSet();
}


Team.hbm.xml

<hibernate-mapping package="set">
	<class name="Team" table="test_team">

		<id name="id" column="id" type="string">
			<generator class="uuid">
			</generator>
		</id>

		 <property name="name" column="team_name" type="string"/>
		 
		 <!-- 映射set里面所存放的对象的表 -->
		 <set name="students" table="test_student">
		 
		 <key column="team_id"></key>
		 
		 <!-- set没有key的概念,因此这里不需要index,只需要element -->
		 <element column="student_name" type="string"/>
		 </set>
		  
		 
	</class>



</hibernate-mapping>



运行Configure,Hibernate会生成如下SQL语句:

create table test_student (
team_id varchar2(255 char) not null,
student_name varchar2(255 char));


create table test_team(
id varchar2(255 char) not null,
team_name varchar2(255 char),
primary key(id));

alter table test_student add constraint FK_dk062403lt7507oncwn9uo4ro foreign key (team_id) references test_team;



也就是说,table test_student的生成信息完全依赖于Team.hbm.xml中的<set>元素的内容。


 <set name="students" table="test_student">
		 <key column="team_id"></key>
		 <element column="student_name" type="string"/>
		 </set>


set name对应的是Team.java中的getter和setter的属性名称。
table="test_student"是数据库中的表名
element定义Set集合的元素。 column是数据库中该表的列名,这里是student_name,数据类型是String
key定义外联到Team表的外键, 这里是team_id。



==============================================================================
插入

	Session session=HibernateUtil.openSession();
		
  		Transaction tx=session.beginTransaction();
 	 
 		Team team=new Team();
 		
 		team.setName("english");
 		
		Set set=team.getStudents();
		
		set.add("alleni");
		set.add("eline");
		
		
		session.save(team);
		
		tx.commit();


这里只要获取这个Set对象, 然后对其进行操作, 最后执行sessin.save(team),就成功把数据插入数据库了。


查询
这里主要讲一下查询的排序
Hibernate的排序分为两种,一种是内存查询排序,一种是数据库查询排序。
内存排序是指获取数据库的数据之后,再在内存中通过Java来排序。
数据库排序是通过SQL语句,比如order by,直接在数据库中排好,再提取出来。

数据库查询排序
设置数据库排序的地方在Team.hbm.xml里:
	 <!-- 映射set里面所存放的对象的表 -->
		 <set name="students" table="test_student" order-by="student_name asc">
		 
		 <key column="team_id"></key>
		 
		 <!-- set没有key的概念,因此这里不需要index,只需要element -->
		 <element column="student_name" type="string"/>
		 </set>


这里一定要注意一点,就是order-by="student_name asc",这里的名称一定要
和映射文件配置的column名称一致。否则会报如下错误:

ERROR: ORA-00904: "STUDENTS0_"."NAME": 标识符无效

Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not extract ResultSet


这里就是因为我把order-by设置成了name asc,
结果Hibernate就会查询student.name, 而Student表中并无此列。

--
如果我们的数据库里有三个student,名字分别是alleni,eline,333,
就会被SQL语句排序成333,alleni,eline,
如下所示:
Hibernate: select students0_.team_id as team1_1_0_, students0_.student_name as student2_0_0_ from test_student students0_ where students0_.team_id=? order by students0_.student_name asc

345
alleni
eline


也就是会在最后加入order by student.student_name asc

以上便是数据库查询排序。


内存排序
内存排序的配置和上面差不多,就是把order-by去掉,改成
sort="natural"
这样不会生成order by的SQL语句,但是Hibernate会通过Java的程序给返回结果排序,默认是升序,和上面的order-by=student_name asc一样。



总结:

map与set标签中的element子标签映射的是原生类型(string,date,int,long..), 既能够直接映射到数据库表字段上的类型, 而one-to-many映射的则是实体类型,指的是无法映射到表的某个字段,而是要映射到整张表的类型。

element和one-to-many是互斥的, 在set以及map标签中,当使用了其中一个,就不能再用另一个。



========================List==============================

List和Set基本差不多。 但是List和Set本质上是有不同的,那就是List是有序的,而Set是乱序的。
当加入元素到List中,是根据加入的顺序排序的。
而Set这个东西,不管你是先进还是后进,它都是给你弄成乱序的。


在Hibernate中,我们要配置List,就必须配置一个标识序列的列,该列用数字表示,0-X。

看看具体配置:
修改后的Team.hbm.xml
	 <list name="students" table="test_student" cascade="all">
		 	<key column="team_id"/>
		 	
		 	<!-- list是有顺序的 -->
		 	<!-- index用于标示多的一方 -->
		 	<index column="index_"></index>
			<one-to-many class="Student"/>
		 	
		 </list>

index_这里会在数据库中生成的Student表中。
具体看看运行就知道了。


Session session=HibernateUtil.openSession();
		
  		Transaction tx=session.beginTransaction();
 	 
 		Team team=new Team();
 		
 		team.setName("english");
 		
		List list=team.getStudents();
		
		
		Student s1=new Student(null,"111","alleni",23,team);
		
		
		Student s2=new Student(null,"222","eline",23,team);
		
		list.add(s1);
		list.add(s2);
		
		
		Team team2=new Team();
		team2.setName("math");
		
		Student s3=new Student(null,"333","mike",23,team2);
		List list2=team2.getStudents();
		list2.addAll(Arrays.asList(s3));
		
		
		
		
		session.save(team);
		session.save(team2);
		
		tx.commit();


最后生成的结果是:




Hibernate会根据list里面的元素的顺序,给所有元素加入index值,插入数据库中。
  • 大小: 89.7 KB
分享到:
评论

相关推荐

    hibernate 中的 set map list 代码

    -Hibernate容器-Hibernate容器映射技术(Set、List、Map)(1)映射技术-Hibernate容器映射技术(Set、List、Map)(1)(Set、List、Map)(1)

    Hibernate常见集合映射(Set,List_Array,Map,Bag)

    Hibernate常见集合映射(Set,List_Array,Map,Bag)

    hibernate 一对多 set 与 list 分别用法

    NULL 博文链接:https://jackroomage.iteye.com/blog/1879354

    LIST对象排序通用方法HIBERNATE的SET排序.pdf

    LIST对象排序通用方法HIBERNATE的SET排序.pdf

    分析LIST对象排序通用方法HIBERNATE的SET排序.pdf

    分析LIST对象排序通用方法HIBERNATE的SET排序.pdf

    Hibernate容器映射技术(Set、List、Map)

    Hibernate容器映射技术(Set、List、Map)

    LIST对象排序通用方法HIBERNATE的SET排序[整理].pdf

    LIST对象排序通用方法HIBERNATE的SET排序[整理].pdf

    Hibernate3.1_学习源码

    案例目录: ...配置文件分别用list、set和map元素配置第二张表。 07 07Hibernate_Mapping : Hibernate中的数据关联技术,是一个重点又是一个难点,演示了 一对一、多对一、一对多、多对多等几种情况。

    Hibernate 高级配置

    Hibernate高级配置 1. Hibernate与触发器协同工作 1)、触发器使session的缓存中的数据与数据库中的数据不一致 2)、session的update()方法盲目的激发触发器 2. Hibernate中的createQuery方法 1)、uniqueResult()...

    hibernate 集合映射

    适合初学者了解在hibernate中配置set,list,map,bag等集合映射

    Hibernate+中文文档

    Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...

    Hibernate中文API大全

    你必须作出一个选择,要么在组合元素中使用不能为空的属性,要么选择使用&lt;list&gt;,,&lt;bag&gt; 或者 而不是 &lt;set&gt;。 组合元素有个特别的用法是它可以包含一个元素。类似这样的映射允许你将一个many-to-many关联表映射为...

    Hibernate实战(第2版 中文高清版)

     2.1.3 Hibernate配置和启动   2.1.4 运行和测试应用程序   2.2 启动Java Persistence项目   2.2.1 使用Hibernate Annotations   2.2.2 使用Hibernate EntityManager   2.2.3 引入EJB组件   2.2.4 切换...

    hibernate集合的映射

    hibernate集合的映射 集合的映射 set list array map

    hibernate 体系结构与配置 参考文档(html)

    Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5...

    hibernate 3中的缓存小结

    Hibernate允许在类和集合的粒度上设置第二级缓存。在映射文件中,和&lt;set&gt;元素都有一个子元素,这个子元素用来配置二级缓存。 示例:以category(产品类别)和product(产品)的映射为例: 1) 修改要配置缓存的那个持久化...

    List<Map>转化为List工具类

    一般使用springjdbc、hibernate的sql查询,库获取到的数据都是List, Object&gt;&gt;结果集,如果我们要转化为JavaBean,则需要做一系列的map.get(),然后obj.set()。 此工程中就是解决List, Object&gt;&gt;转化为JavaBean工具类...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到CUSTOMERS表  3.5 通过...

    hibernate 教程

    map, set, list, bag 5.1.16. 引用(import) 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 持久化枚举(Persistent enum)类型 5.2.4. 自定义值类型...

    hibernate3.2中文文档(chm格式)

    Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...

Global site tag (gtag.js) - Google Analytics