这个方法和之前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值,插入数据库中。