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值,插入数据库中。

猜你喜欢

转载自alleni123.iteye.com/blog/1979812