- 浏览: 830740 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (379)
- struts (5)
- hibernate (16)
- spring (16)
- ssh (20)
- MySQL (16)
- 数据库脚本 (2)
- DownLoad (1)
- GAE (5)
- Java (103)
- LoadRunner (2)
- VF (1)
- 学习资料 (24)
- 软件使用 (21)
- 通信类 (4)
- 生活 (3)
- J2ME (1)
- 心理学 (1)
- Linux (26)
- Android (3)
- Oracle (1)
- 面向对象概念&面试准备 (11)
- ExtJs (2)
- Google Map (1)
- Flex (47)
- 算法研究 (1)
- share (20)
- python (1)
- MongoDB (7)
- centos6 (13)
- C++ (8)
- DB2 (3)
- C# (1)
- 代码片段 (24)
- Lucene (2)
- php (1)
- NodeJS (1)
- Express (1)
最新评论
-
shua1991:
已阅,我表示同意。
Eclipse统计代码行数 -
nakedou:
写的不错,挺详细的
在CentOS中使用 yum 安装MongoDB及服务器端配置 -
sjp524617477:
好方法
Eclipse统计代码行数 -
simpletrc:
<script>ale ...
Java写到.txt文件,如何实现换行 -
csdn_zuoqiang:
Apache Ftp Server,目前是1.0.4,非常好的 ...
Apache FtpServer在64位系统下服务不能启动解决方法
原文地址:http://blog.csdn.net/xyls_2009/archive/2009/12/30/5109374.aspx
在配置文件中hibernate这个前缀可以省略不写
如:<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
可写为<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
当我们的类名或属性名与数据库中的关键字冲突时,我们可以修改表中的字段名,也可以在映射文件
中加上反引号(`)在tab键上方,这时会当作字符串处理;或修改对应的表名称
如:在oracle中user是一个关键字
<class name="User" table="`user`"> 或 <class name="User" table="tuser">
<property name="name" column="tname"/> 如这种
</class>
在配置文件中如果没有指定table、column则hibernate会按默认执行,即表名与类名相同,字段名
与属性名相同.
如果要求不允许有相同的name,则可以加上: unique="true"如下
<property name="name" unique="true"/>
对于下面这句代码
User user = (User) session.get(User.class, id);
我们可以这样理解
由于Session可以管理多个数据库表所对应的多个实体对象,如果查询id为1的实体对象,
Session.get方法需要知道从哪个数据库表中查询id为1的记录,所以,除了给get方法传递所
要查询的实体对象的id值外,还必须给get方法传递实体对象的类型,get方法才能知道去哪个
数据库表中进行查询
通过学习,我们可以发现通过session去查询数据库有很大的局限性,它只能通过id去查询,而
在现实使用中,我们的需求肯定不只这些.这时我们就需要通过hql完成查询,hql是通过query创建
的:Query query = session.createQuery(hql);
以往的sql是查表,而这里的hql是查询对象
还有一种比hql更方便的查询方式:Criteria,这也是由session创建的:
Criteria crit = session.createCriteria(Class clazz);
使用 命名参数 替换?
如:String hql = "from User as user where user.name=?";
query = session.createQuery(hql);
query.setString(0, name);//下标从0开始,跟jdbc不同
可通过命名参数修改为
String hql = "from User as user where user.name=:name";需要加上一个冒号
query = session.createQuery(hql);
query.setString(name, "xyls");
这样做就可以避免因为失误造成错误
实现分页
query.setFirstResult(0);//从哪一条开始取
query.setMaxResults(10);//取多少条记录
好处:跨数据库,可移植,不论用哪一种数据库,都可以通过此种方式,hibernate中通过方言类生成分页语句
oracle用rowNormal
mysql用limit
sqlserver用top
要注意单向关联与双向关联的关系
多对多关系(如:teacher-student),在操作和性能方面都不太理想,所以多对多的映射使用较少,
实际使用中最好转换成一对多的对象模型,Hibernate会为我们创建中间关联表,转换成两个一对多的关系.
多对一的关系使用的最多
在学习Hibernate如何处理对象之间的关联关系的底层细节时,可以从两个方面去考虑:
.如何将对象之间的关联关系保存到数据库中
.如何检索出关联的对象
List存储是有序的,而Set是无序的
<set name="emps">
<key column="depart_id"/>
<one-to-many class="Employee"/>
</set>
<list name="emps">
<key column="depart_id"/>
<!-- 下面这列不需要程序代码与之对应,这是hibernate的需要 ,进行排序-->
<list-index column="order_col"/>
<one-to-many class="Employee"/>
</list>
bag标签与list是相对应的,使用bag将不会进行排序了,可用下面的代码替换上面的
表结构中不会多出order_col这一列
<bag name="emps">
<key column="depart_id"/>
<one-to-many class="Employee"/>
</bag>
下面是使用Map的形式
<map name="emps">
<key column="depart_id"/>
<map-key type="string" column="name"/>
<one-to-many class="Employee"/>
</map>
下面是使用数组的形式,数组存储也是有序的,使用很少
<array name="emps">
<key column="depart_id"/>
<index column="array_col"/>
<one-to-many class="Employee"/>
</array>
我们在hibernate中常使用Set
List集合类型在有些一对多关联关系中可能会很有用,例如:在论坛的版面管理中,将会涉及到
版面的上移/下移等操作,这就需要在版面集合中维护顺序,用List集合类型就能很好的解决这个问题.
hibernate为了完成懒加载的功能,将所有的集合类都重写了一遍,如果我们进行强制类型转换,
运行时会报异常.
***级联(cascade)和关系维护(inverse):
hibernate默认对关联属性不进行实际的操作,通过配置级联可以实现
级联cascade:用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作
一般对 多对一,多对多不设置级联,在一对一,一对多中设置级联
如:<set name="emps" cascade="save-update">//cascade有很多可选用的值
<key column="depart_id"/>
<one-to-many class="Employee"/>
</set>
**hibernate缺省情况下是维护关联关系的inverse="false" **
inverse:是否放弃维护关联关系(在java中两个对象产生关联关系时,对数据库表的影响),
在一对多和多对多的集合定义中使用,inverst="true"表示该对象不维护关联关系,该属性的值一般在
使用有序集合时设置成false(hibernate缺省值是false).
一对多维护关联关系就是更新外键,
多对多维护关联关系就是在中间表中增删记录.(两端都告诉,会报异常,可通过放弃关系维护避免)
注:配置成一对一的对象不维护关联关系
inverse属性只会在集合中出现,如Set,List,array,Map,不同于cascade
如:<set name="emps" inverse="true">//效率会更高一些,不会产生update语句,一端不会考虑多端
<key column="depart_id"/>
<one-to-many class="Employee"/>
</set>
注:inverse不允许在有序的集合中使用,如:List,数组等 因为inverse端放弃维护关联关系,有序集合
就不会再去记忆插入进来的数据的顺序
hibernate不允许多的一端放弃维护关联关系
继承关系映射:
在一张表中实现
<discriminator column="type" type="int"/>//鉴别器,用来区别不同的子类,应放在id属性下面
type="string"是默认的
如:<subclass name="Skiller" discriminator-value="1">
<property name="skill"/>
</subclass>
<subclass name="Sales" discriminator-value="2">
<property name="sell"/>
</subclass>
discriminator-value="*"用来区分
特有的字段不能加上非空约束
每个子类对应一张表,效率低,但是在关系模型上更合理
<joined-subclass name="Skiller" table="skiller">
<key column="emp_id"/>
<property name="skill"/>
</joined-subclass>
<joined-subclass name="Sales" table="sales">
<key column="emp_id"/>
<property name="sell"/>
</joined-subclass>
另一种情况:还需要鉴别器,单独一张表处理sales,效率得到了提升
<discriminator column="type" type="int"/>
<subclass name="Skiller" discriminator-value="1">
<property name="skill"/>
</subclass>
<subclass name="Sales" discriminator-value="2">
<join table="sales">
<key column="emp_id"/>
<property name="sell"/>
</join>
</subclass>
如果有异常,可以通过删除数据库完成操作,因为之前会有三张表
每个类独立映射:不再提取公共类,不需要关联查询,每个具体类一张表
(混全使用"一个类继承体系一张表"和"每个子类一张表"),需要更换主键生成策略hilo,不再需
要鉴别器,操作时报异常,需要删除相关表,或删除数据库,重建
如果主表是抽象的,加一个属性abstract="true",就不会产生Employee表了
<id name="id">
<generator class="hilo"/>
</id>
<union-subclass name="Skiller" table="skiller">
<property name="skill"/>
</union-subclass>
<union-subclass name="Sales" table="sales">
<property name="sell"/>
</union-subclass>
注意一条原则:表的数目不要超过类的数目,表越多关联查询就越多,效率就越低
发表评论
-
Hibernate配置文件中指定MySQL数据库的编码方式
2010-10-02 21:50 6562Hibernate配置文件中指定MySQL数据库的编码方式 ... -
hibernate主键生成策略设置不当导致的错误
2010-09-05 12:53 8686ERROR - Exception executing bat ... -
ehcache版本问题导致的一个错误
2010-09-05 10:53 8137org.springframework.beans.facto ... -
hibernate如何设置数据库中字段的默认值
2010-09-03 20:30 2066在配置文件中 <property name=&qu ... -
hibernate3 小结
2010-08-05 16:24 9861、Configuration/SessionFactor ... -
hibernate3的缓存管理
2010-08-05 16:01 8741、Cache简介: 缓 ... -
Hibernate 继承关系的映射
2010-08-04 18:38 1006Hibernate 中支持的 3种类型的继承关系: 1, ... -
hibernate inverse,cascade说明
2010-08-04 00:25 11031.cascade="..."? cas ... -
hibernate关联关系-组件关联
2010-08-03 13:28 914组件关联关系的映射与原理: 模型:User — Nam ... -
hibernate关联关系-一对一
2010-08-03 13:23 840hibernate关联关系:一对一 模型:Person ... -
hibernate关联关系-多对一
2010-08-03 13:18 937多对一关联关系: 模型:员工Employee — 部门 ... -
hibernate CRUD模板
2010-08-01 18:18 2152实验步骤: 1.设计domain对象User。 2.设计U ... -
Hibernate setFirstResult()和setMaxResults()实现分页查询
2010-07-31 16:04 3594Hibernate 可以实现分页查询,例如: 从第2万条开始取 ... -
hibernate-001
2010-07-31 01:05 1034package com.hibernate.domain; ... -
DAO编程模式
2010-06-03 15:32 874J2EE开发人员使用数据访问对象(DAO)设计模式把底层的数据 ...
相关推荐
学习hibernate框架时,整理的笔记,对hibernate框架有全面的介绍
全方位学习hibernate必备,这是本人学习过程中整理的笔记。相信可以对你的hibernate学习有所帮助!
学习hibernate框架笔记整理和自己对hibernate认知,相互学习
韩顺平的hibernate笔记资料,详细记录讲课的内容和整理的图像资料
Java Hibernate4天学习笔记整理可用于提交作业
尚学堂hibernate学习笔记(原版整理),配合视频教程使用
hibernate课程笔记.doc,传智老师的用的笔记,个人也在整理过,对于初学者来说很实用。
个人整理的有关hibernate的一点点笔记
达内Java 开发教学笔记整理合集: Unix 笔记 Core JAVA 笔记 OOAD思想 笔记 Oracle 笔记 JDBC 笔记 Hibernate 笔记 HTML&java script 笔记 Servlet 笔记 Jsp 笔记 Struts 1.2 笔记 Struts 2 笔记 Ajax 笔记 Spring ...
自己做的一个笔记,希望对你有用。一会我会上传源代码的。
马士兵hibernate学习笔记(文字整理版).
这是在培训机构培训完后整理的JDBC&Hibernate学习笔记,其中收集了自己遇到的问题。
传智播客_hibernate李勇笔记是在学习李勇老师讲的hibernate3.2.5后整理的笔记
Hibernate精品笔记,诚心整理,必属精品
hibernate读书笔记,里面有一些实例和解说,是自己整理的,非常适合开发时做参考
hibernate学习笔记,个人整理的马士兵老师系列讲座的笔记,有些内容是补充的。
我自己在学习过程中做的电子笔记和一些要点的整理,希望发感兴趣的朋友下载,才一分,看在我辛辛苦苦整理的份上,不要嫌要下载分哦!