首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate配置Set跟List

2013-12-04 
Hibernate配置Set和ListSet 这个方法和之前map说

Hibernate配置Set和List
========================Set==============================

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


Team.java




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



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



这里一定要注意一点,就是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



Hibernate会根据list里面的元素的顺序,给所有元素加入index值,插入数据库中。

热点排行