- 浏览: 364557 次
- 来自: 北京
文章分类
- 全部博客 (237)
- XML (6)
- JavaSE (39)
- Junit (1)
- Maven (10)
- JavaScript (12)
- JavaEE (16)
- HTML5 (10)
- java多线程 (8)
- Hibernate (30)
- Java反射 (3)
- Spring (11)
- Struts (1)
- svn (2)
- linux (12)
- 代码实例 (1)
- 设计模式 (1)
- UML (1)
- javassist (1)
- Oracle (3)
- Hibernate异常 (9)
- DWR (6)
- Java泛型 (2)
- SpringMVC (11)
- Dbunit (3)
- github (2)
- Algorithm (1)
- zTree (1)
- jquery (7)
- freemarker (4)
- mysql (5)
- ffmpeg (1)
- 编码 (1)
- lucene (15)
- hadoop (1)
- JVM (1)
- Regular Expressions (5)
- myeclipse (1)
- 爬虫 (7)
- 加密 (3)
- WebService (2)
- Socket (2)
- Windows (1)
最新评论
-
wxpsjm:
好直接
HV000030: No validator could be found for type: java.lang.Integer. -
wxhhbdx:
学习了,对新手来说很不错的教程。
SpringMVC入门 (二) 数值传递 -
xgcai:
正好在学dwr
DWR入门 (二)用户实例
========================Set==============================
这个方法和之前map说的基本一样。
http://alleni123.iteye.com/admin/blogs/1979726
不需要配置Student.hbm.xml, 只要创建一个没有属性的Student.java
Team.java
Team.hbm.xml
运行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。
==============================================================================
插入
这里只要获取这个Set对象, 然后对其进行操作, 最后执行sessin.save(team),就成功把数据插入数据库了。
查询
这里主要讲一下查询的排序
Hibernate的排序分为两种,一种是内存查询排序,一种是数据库查询排序。
内存排序是指获取数据库的数据之后,再在内存中通过Java来排序。
数据库排序是通过SQL语句,比如order by,直接在数据库中排好,再提取出来。
数据库查询排序
设置数据库排序的地方在Team.hbm.xml里:
这里一定要注意一点,就是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
index_这里会在数据库中生成的Student表中。
具体看看运行就知道了。
最后生成的结果是:
Hibernate会根据list里面的元素的顺序,给所有元素加入index值,插入数据库中。
这个方法和之前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值,插入数据库中。
发表评论
-
Connection is read-only. Queries leading to data modification are not allowed。
2014-04-06 21:52 3648<tx:advice id="txAdvic ... -
org.hibernate.HibernateException: No Session found for current thread
2014-04-06 12:37 0今天在maven中整合spring和hibernate,并使用 ... -
select new Topic from ' Mysql 生成SQL语句错误
2014-03-30 22:51 1616Caused by: com.mysql.jdbc.exce ... -
Unable to locate appropriate constructor on class
2014-02-20 00:11 1420org.hibernate.hql.internal.ast. ... -
Hibernate的load和get实际应用区分简单实例
2013-12-18 11:58 829今天在看孔浩的CMS视频时候看到的。 在57 -文章管理06 ... -
自定义OpenSessionInViewer过滤器
2013-12-11 12:12 995摘自孔浩视频 spring部分-17_spring_SSH整合 ... -
数据库事务 (三)虚读(Phantom Read)
2013-12-01 13:21 0关于各种读 虚读 phantom read: 转自维基 ... -
Hibernate悲观锁
2013-11-30 17:30 0为了防止两个线程同时修改一个数据,造成更新数据丢失,我们可以使 ... -
Hibernate查询HQL实例
2013-11-29 15:56 1251三个实体类对象: public class Team { ... -
QBC与HQL检索
2013-11-28 17:39 0QBC(Query By Criteria) API提供了检索 ... -
Hibernate继承映射
2013-11-28 12:36 611继承映射分为三种情况 1.每个子类一张表 比如说有一个Pers ... -
Hibernate通过Composite-element配置外联表实例 (码)
2013-11-28 11:07 982摘自圣思园Hibenrate 26. 组件映射深度解析 -37 ... -
Hibernate配置复合主键 composite primary key (二)
2013-11-27 16:41 1404摘自圣思园Hibernate 26.组件映射深度解析 上一篇 ... -
Hibernate配置复合主键 composite primary key (一)
2013-11-27 14:15 2409这篇是关于如何配置Hibernate实现复合主键的映射功能。 ... -
Hibernate通过Comparator接口自定义排序规则
2013-11-25 20:42 2470摘自圣思园 Hibernate25.自定义内存排序器详解及符合 ... -
Hibernate的Map配置
2013-11-23 16:21 1257摘自圣思园022.Hibernate映 ... -
Hibernate多对多配置
2013-11-21 22:39 841场景: Student和Course,每一个Student有多 ... -
Hibernate延迟加载案例 (多: 一: 一,附代码)
2013-11-21 17:41 557摘自圣思园Hibernate20.一 ... -
Hibernate一对一配置
2013-11-20 21:49 997摘自圣思园 19.Hibernate的对象检索策略深度解析.a ... -
Hibernate的对象检索策略 (一) SQL左外连接检索策略
2013-11-20 15:32 1093首先是测试表的结构: 先通过hibernate将数据放入 ...
相关推荐
-Hibernate容器-Hibernate容器映射技术(Set、List、Map)(1)映射技术-Hibernate容器映射技术(Set、List、Map)(1)(Set、List、Map)(1)
Hibernate常见集合映射(Set,List_Array,Map,Bag)
NULL 博文链接:https://jackroomage.iteye.com/blog/1879354
LIST对象排序通用方法HIBERNATE的SET排序.pdf
分析LIST对象排序通用方法HIBERNATE的SET排序.pdf
Hibernate容器映射技术(Set、List、Map)
LIST对象排序通用方法HIBERNATE的SET排序[整理].pdf
案例目录: ...配置文件分别用list、set和map元素配置第二张表。 07 07Hibernate_Mapping : Hibernate中的数据关联技术,是一个重点又是一个难点,演示了 一对一、多对一、一对多、多对多等几种情况。
Hibernate高级配置 1. Hibernate与触发器协同工作 1)、触发器使session的缓存中的数据与数据库中的数据不一致 2)、session的update()方法盲目的激发触发器 2. Hibernate中的createQuery方法 1)、uniqueResult()...
适合初学者了解在hibernate中配置set,list,map,bag等集合映射
Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...
你必须作出一个选择,要么在组合元素中使用不能为空的属性,要么选择使用<list>,,<bag> 或者 而不是 <set>。 组合元素有个特别的用法是它可以包含一个元素。类似这样的映射允许你将一个many-to-many关联表映射为...
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集合的映射 集合的映射 set list array map
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允许在类和集合的粒度上设置第二级缓存。在映射文件中,和<set>元素都有一个子元素,这个子元素用来配置二级缓存。 示例:以category(产品类别)和product(产品)的映射为例: 1) 修改要配置缓存的那个持久化...
一般使用springjdbc、hibernate的sql查询,库获取到的数据都是List, Object>>结果集,如果我们要转化为JavaBean,则需要做一系列的map.get(),然后obj.set()。 此工程中就是解决List, Object>>转化为JavaBean工具类...
3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射文件 3.4.1 映射文件的文档类型定义(DTD) 3.4.2 把Customer持久化类映射到CUSTOMERS表 3.5 通过...
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. 自定义值类型...
Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...