- 浏览: 377585 次
- 来自: 北京
文章分类
- 全部博客 (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 3737<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 1661Caused by: com.mysql.jdbc.exce ... -
Unable to locate appropriate constructor on class
2014-02-20 00:11 1467org.hibernate.hql.internal.ast. ... -
Hibernate的load和get实际应用区分简单实例
2013-12-18 11:58 876今天在看孔浩的CMS视频时候看到的。 在57 -文章管理06 ... -
自定义OpenSessionInViewer过滤器
2013-12-11 12:12 1059摘自孔浩视频 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 1295三个实体类对象: public class Team { ... -
QBC与HQL检索
2013-11-28 17:39 0QBC(Query By Criteria) API提供了检索 ... -
Hibernate继承映射
2013-11-28 12:36 653继承映射分为三种情况 1.每个子类一张表 比如说有一个Pers ... -
Hibernate通过Composite-element配置外联表实例 (码)
2013-11-28 11:07 1022摘自圣思园Hibenrate 26. 组件映射深度解析 -37 ... -
Hibernate配置复合主键 composite primary key (二)
2013-11-27 16:41 1450摘自圣思园Hibernate 26.组件映射深度解析 上一篇 ... -
Hibernate配置复合主键 composite primary key (一)
2013-11-27 14:15 2456这篇是关于如何配置Hibernate实现复合主键的映射功能。 ... -
Hibernate通过Comparator接口自定义排序规则
2013-11-25 20:42 2528摘自圣思园 Hibernate25.自定义内存排序器详解及符合 ... -
Hibernate的Map配置
2013-11-23 16:21 1300摘自圣思园022.Hibernate映 ... -
Hibernate多对多配置
2013-11-21 22:39 884场景: Student和Course,每一个Student有多 ... -
Hibernate延迟加载案例 (多: 一: 一,附代码)
2013-11-21 17:41 594摘自圣思园Hibernate20.一 ... -
Hibernate一对一配置
2013-11-20 21:49 1050摘自圣思园 19.Hibernate的对象检索策略深度解析.a ... -
Hibernate的对象检索策略 (一) SQL左外连接检索策略
2013-11-20 15:32 1141首先是测试表的结构: 先通过hibernate将数据放入 ...
相关推荐
本篇文章将深入探讨`Hibernate`中一对多关系使用`Set`和`List`的区别以及它们的实现方式。 首先,我们要理解`Set`和`List`在Java集合框架中的本质区别。`Set`不包含重复元素,且内部元素有序,但插入顺序不保证;而...
在探讨Hibernate中List信息的配置时,我们主要聚焦于如何在ORM(对象关系映射)框架下有效地管理和操作集合类型,尤其是List、Set以及Map。本文将深入解析List与Set在Hibernate中的映射机制,同时也会简要提及Map的...
常见的集合映射类型有 Set、List、Array、Map 和 Bag 等,每种类型都有其特点和应用场景。 Set 集合映射 Set 集合是 Hibernate 中基础的集合类型,元素数据一般使用外键同主表关联。Set 集合非常适用于集合元素不...
本文将深入探讨`hibernate set 集合映射`这一主题,结合标签“源码”和“工具”,我们将讨论其基本概念、配置、以及在实际开发中的应用。 ### Hibernate集合映射基础 1. **集合类型**:Hibernate支持多种集合类型...
本主题主要聚焦于如何利用Hibernate处理集合类型的属性,包括Set、List和Map。这些集合类型的映射允许我们在一个实体类中存储多个相关联的数据项,从而实现一对多或多对多的关系。 首先,Set是不包含重复元素的集合...
如果不使用注解,我们可以在`hibernate.cfg.xml`中配置实体类和数据库表的关系,然后在实体类的`.hbm.xml`文件中定义集合属性的映射。例如,`User.hbm.xml`可能包含以下内容: ```xml <!-- 其他属性映射 --> ...
LIST对象排序通用方法HIBERNATE的SET排序.pdf
分析LIST对象排序通用方法HIBERNATE的SET排序.pdf
Hibernate容器映射技术(Set、List、Map)
LIST对象排序通用方法HIBERNATE的SET排序[整理].pdf
这个接口用于设置Hibernate所需的配置信息,如数据源、连接参数等,并根据配置文件读取信息创建`SessionFactory`。`SessionFactory`是一个重量级对象,它是整个应用中唯一需要实例化的对象,用于创建`Session`对象。...
Hibernate通过XML配置文件或注解来定义对象与数据库表之间的映射关系。这些映射使得开发者可以用Java对象的方式来操作数据库,减少了对SQL的直接依赖。 对于分页显示,我们通常需要使用`Criteria`、`Query`接口或者...
在本文中,我们将深入探讨如何在Spring Boot 2.1.4.RELEASE项目中结合JPA(Java Persistence API)和Hibernate实现Redis作为二级缓存。首先,我们需要理解这些技术的基本概念。 Spring Boot 是一个用于简化Spring...
Spring Boot因其简化配置和快速开发的能力而备受青睐,而MyBatis和Hibernate则是Java世界里常用的持久层解决方案。这里我们将看到如何将它们集成到同一个应用中,以充分利用各自的优势。 首先,我们需要在`pom.xml`...
Hibernate 中的 createQuery 和 createSqlQuery 区别详解 在 Hibernate 中,createQuery 和 createSqlQuery 是两个常用的查询方法,但是它们之间存在着一些关键的区别。了解这两个方法的差异对于正确地使用 ...
本文将深入探讨Hibernate中的四种主要集合映射类型:Set、List、Array和Map,以及它们在实际开发中的应用场景和配置。 一、Set集合映射 Set集合映射是最常见的映射类型,它不允许重复元素。在Hibernate中,Set通常...
10. **集合映射**:Hibernate支持多种集合类型(如List、Set、Map等)与数据库表中的多对一、一对多、多对多关系的映射。 11. **事件监听器**:Hibernate允许注册事件监听器,对持久化对象的各种操作(如保存、更新...
3. **执行SQL查询**:在Java代码中,我们可以使用SessionFactory的createSQLQuery方法来获取SQLQuery对象,然后调用其setParameters方法设置参数,最后调用list或uniqueResult等方法来执行查询: ```java Session ...
通过`set`、`list`、`map`等集合节点实现一对多的关联映射,其中`inverse`属性用于控制关联关系的维护方。 #### 7. 多对一关联 `many-to-one`节点表示多对一的关系,通常涉及外键引用。 #### 8. 多对多关联 `...
案例目录: ...配置文件分别用list、set和map元素配置第二张表。 07 07Hibernate_Mapping : Hibernate中的数据关联技术,是一个重点又是一个难点,演示了 一对一、多对一、一对多、多对多等几种情况。