[size=x-large]========================[b]Set[/b]============================== [/size]
这个方法和之前map说的基本一样。
[url]http://alleni123.iteye.com/admin/blogs/1979726[/url]
不需要配置Student.hbm.xml, 只要创建一个没有属性的Student.java
Team.java
Team.hbm.xml
运行Configure,Hibernate会生成如下SQL语句:
[color=gray]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;[/color]
也就是说,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。
==============================================================================
[b][size=x-large]插入[/size][/b]
这里只要获取这个Set对象, 然后对其进行操作, 最后执行sessin.save(team),就成功把数据插入数据库了。
[b][size=x-large]查询[/size][/b]
这里主要讲一下查询的排序
Hibernate的排序分为两种,一种是内存查询排序,一种是数据库查询排序。
[b]内存排序[/b]是指获取数据库的数据之后,再在内存中通过Java来排序。
[b]数据库排序[/b]是通过SQL语句,比如order by,直接在数据库中排好,再提取出来。
[size=large][b]数据库查询排序[/b][/size]
设置数据库排序的地方在Team.hbm.xml里:
这里一定要注意一点,就是order-by="[b]student_name[/b] asc",这里的名称一定要
和映射文件配置的column名称一致。否则会报如下错误:
[color=red]ERROR: ORA-00904: "STUDENTS0_"."NAME": 标识符无效
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not extract ResultSet[/color]
这里就是因为我把order-by设置成了name asc,
结果Hibernate就会查询student.name, 而Student表中并无此列。
--
如果我们的数据库里有三个student,名字分别是alleni,eline,333,
就会被SQL语句排序成333,alleni,eline,
如下所示:
[color=gray]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[/color]
也就是会在最后加入order by student.student_name asc
以上便是数据库查询排序。
[size=large][b]内存排序[/b][/size]
内存排序的配置和上面差不多,就是把order-by去掉,改成
[b]sort="natural"[/b]
这样不会生成order by的SQL语句,但是Hibernate会通过Java的程序给返回结果排序,默认是升序,和上面的order-by=student_name asc一样。
[size=xx-large][b]总结:[/b][/size]
[b]map与set[/b]标签中的element子标签映射的是[b]原生类型[/b](string,date,int,long..), 既能够直接映射到数据库表字段上的类型, 而[b]one-to-many[/b]映射的则是[b]实体类型[/b],指的是无法映射到表的某个字段,而是要映射到整张表的类型。
element和one-to-many是[b]互斥[/b]的, 在set以及map标签中,当使用了其中一个,就不能再用另一个。
[size=x-large]========================[b]List[/b]============================== [/size]
List和Set基本差不多。 但是List和Set本质上是有不同的,那就是List是有序的,而Set是乱序的。
当加入元素到List中,是根据加入的顺序排序的。
而Set这个东西,不管你是先进还是后进,它都是给你弄成乱序的。
在Hibernate中,我们要配置List,就必须配置一个标识序列的列,该列用数字表示,0-X。
看看具体配置:
修改后的Team.hbm.xml
index_这里会在数据库中生成的Student表中。
具体看看运行就知道了。
最后生成的结果是:
[img]http://dl2.iteye.com/upload/attachment/0091/5156/1ab8586b-f700-332f-9b76-3c8fe4174270.jpg[/img]
Hibernate会根据list里面的元素的顺序,给所有元素加入index值,插入数据库中。
这个方法和之前map说的基本一样。
[url]http://alleni123.iteye.com/admin/blogs/1979726[/url]
不需要配置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语句:
[color=gray]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;[/color]
也就是说,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。
==============================================================================
[b][size=x-large]插入[/size][/b]
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),就成功把数据插入数据库了。
[b][size=x-large]查询[/size][/b]
这里主要讲一下查询的排序
Hibernate的排序分为两种,一种是内存查询排序,一种是数据库查询排序。
[b]内存排序[/b]是指获取数据库的数据之后,再在内存中通过Java来排序。
[b]数据库排序[/b]是通过SQL语句,比如order by,直接在数据库中排好,再提取出来。
[size=large][b]数据库查询排序[/b][/size]
设置数据库排序的地方在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="[b]student_name[/b] asc",这里的名称一定要
和映射文件配置的column名称一致。否则会报如下错误:
[color=red]ERROR: ORA-00904: "STUDENTS0_"."NAME": 标识符无效
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not extract ResultSet[/color]
这里就是因为我把order-by设置成了name asc,
结果Hibernate就会查询student.name, 而Student表中并无此列。
--
如果我们的数据库里有三个student,名字分别是alleni,eline,333,
就会被SQL语句排序成333,alleni,eline,
如下所示:
[color=gray]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[/color]
也就是会在最后加入order by student.student_name asc
以上便是数据库查询排序。
[size=large][b]内存排序[/b][/size]
内存排序的配置和上面差不多,就是把order-by去掉,改成
[b]sort="natural"[/b]
这样不会生成order by的SQL语句,但是Hibernate会通过Java的程序给返回结果排序,默认是升序,和上面的order-by=student_name asc一样。
[size=xx-large][b]总结:[/b][/size]
[b]map与set[/b]标签中的element子标签映射的是[b]原生类型[/b](string,date,int,long..), 既能够直接映射到数据库表字段上的类型, 而[b]one-to-many[/b]映射的则是[b]实体类型[/b],指的是无法映射到表的某个字段,而是要映射到整张表的类型。
element和one-to-many是[b]互斥[/b]的, 在set以及map标签中,当使用了其中一个,就不能再用另一个。
[size=x-large]========================[b]List[/b]============================== [/size]
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();
最后生成的结果是:
[img]http://dl2.iteye.com/upload/attachment/0091/5156/1ab8586b-f700-332f-9b76-3c8fe4174270.jpg[/img]
Hibernate会根据list里面的元素的顺序,给所有元素加入index值,插入数据库中。
本文深入探讨了在Hibernate框架中使用Set与List的配置与操作,包括它们的区别、如何在映射文件中进行配置以及如何进行数据的插入、查询等操作。重点介绍了Set与List在映射文件中的配置细节,以及如何实现数据的有序插入与查询。
377

被折叠的 条评论
为什么被折叠?



