- 浏览: 63263 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
xnxylxh:
辛苦了
JTest的使用 -
bruceyu:
Teeda和dbFlute的相关知识,若是有的话,不妨贴出,大 ...
日本流行的Seasar开源框架学习笔记 -
yangpeihai:
不错不错,都是我要的,楼主辛苦了
Flex书籍 -
likeblood:
这全是做软件的 没有开饭店的 最好别从这找出路 给你出主意也是 ...
老程序员想开饭店做老板,如何将发挥长处,在餐饮业进行软件开发实践可行么? -
凯旋人生:
up下呀。
老程序员想开饭店做老板,如何将发挥长处,在餐饮业进行软件开发实践可行么?
mySql数据库的隔离级别
Mysql:
查询隔离级别: select @@tx_isolation; REPEATABLE-READ (可重复读)
更改隔离级别: set transaction isolation level read uncommitted;(未提交读, 没commit也能读到)
cascade="all" 级联操作
inverse="true" 控制反转
◆继承映射
1)父、子类在一个表中:
<class name="Animal" package="extendsMapping" table="t_animal">
<id name="id">
<generator class="native"/>
</id>
<!--鉴别器要紧挨着放到id下面这个string是hibernate类型,也可以-->
<discriminator column="type" type="string"/>用java类型
<property name="name"/>
<property name="sex"/>
<subclass name="Pig" discriminator-value="P">
<property name="weight"/>
</subclass>
<subclass name="Bird" discriminator-value="B">
<property name="height">
</subclass>
</class>
2)每个父、子类在一个表中:
<class name="Animal" package="extendsMapping" table="t_animal">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="sex"/>
<joined-subclass name="Pig">
<key column="pid"/>
<property name ="weight"/>
</joined-subclass>
<joined-subclass name="Bird">
<key column="bid"/>
<property name="height"/>
</joined-subclass>
</class>
3)父类无表(有,设成抽象也不导出的),每个子类都对应一张表:(子类间id不能从)
<class name="Animal" package="extendsMapping" table="t_animal" abstract="true">
<id name="id">
<generator class="assigned "/><!--主键不能重复需要手动分配-->
</id>
<property name="name"/>
<property name="sex"/>
<union-subclass name="Pig" tabble="t_pig">
<property name="weight"/>
</union-subclass>
<union-subclass name="Bird" tabble="t_birg">
<property name="height"/>
</union-subclass>
</class>
◆component 映射 :
在hibernate中,component是实体对象的逻辑组成部分,component与实体对象的本质区别是它没有oid,
component的好处,它实现了对象的层次细粒度划分,层次分明,利于复用
<hibernate-mapping>
<class name="mapping.User">
<id name="id">
<generator class="native"/>
</id>
<property name="name">
<component name="contact">
<property name="contactTel"/>
<property name="email"/>
<property name="zipCode"/>
<property name="address"/>
</component>
</hibernate-mapping>
◆复合主键(联合主键)映射
通常将复合主键相关的属性,放到单独的实体类中
该实体类
● 必须实现序列化接口 implements Serializable
● 必须重写equals和hashcode方法
<hibernate-mapping>
<class name="ormapping.FiscalYearPeriod" table="t_fiscal_year_period">
<composite-id name="fiscalYearPeriodPK">
<key-property name="fiscalYear"/>
<key-property name="fiscalPeriod"/>
</composite-id>
<property name="beginDate"/>
<property name="endDate"/>
<property name="periodSts"/>
</class>
</hiberante-mapping>
◆集合映射映射
●set
●list
●array
●map
<hibernate-mapping>
<class name="ormapping.CollectionMapping">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="setValues" table="t_setvalues">
<key column="setid"/>
<element type="string" column="value"></element>
</set>
<list name="listValues" table="t_listvalues">
<key cloumn="lid"/>
<list-index column="list_index"/><!--维护list的顺序-->
<element type="string" column="value"/>
</list>
<array name="arrayValues" table="t_arrayvalues">
<key column="arrayid"/>
<list-index column="array_index"/>
<element type="string" column="value"/>
<!--如果不是普通属性用<composite-element>-->
</array>
<map name="mapValues" table="t_mapvalues">
<key column="mapid">
<map-key type="string" column="key"/>
<element type="string" column="value"/>
</map>
</class>
</hibernate-mapping>
◆树的映射,
节点-父节点 many-to-one, 节点-子节点 one-to-many
<hibernate-mapping>
<class name="ormapping.Node" table="t_node">
<id name="id">
<generator class="native"/>
</id>
<porperty name="name"/>
<property name="levle"/>
<property name="leaf"/>
<!--<many-to--one>在多的一段加个外键指向一的一端,这个例子中就一个表,加的外键指向本表,即自关联-->
<many-to-one name="parent" column="pid"/>
<set name="children" lazy="extra" inverse ="true">
<key column="pid"/>
<one-to-many class="ORMapping.Node" >
</set>
</class>
</hibernate-mapping>
◆ hibernate中的锁
悲观锁:其实现一般依赖于数据库提供的机制,在整个处理过程中数据将处于锁定状态
例如: select * from user for update
select * from user for update nowait(oracle用)
hibernate中用 load(Class theClass,Serializable id,LockMode lockMode),
lockMode: UPGRADE(ORACLE用 UPGRADE_NOWAIT)
乐观锁:大多数是基于数据版本记录机制实现(version),一般在数据库中加一个version字段
读取数据时连同版本号一同读出,之后更新是版本号加一,如果提交数据小于当前版本
号则认为数据是过期的否则才能更新。(也有用时间戳实现的。)
<hibernate-mapping>
<class name="ormapping.user" optimistic-lock="version" ><!--不写也可以默认就是version-->
<id name="id">
<generator class="uuid"/>
</id>
<version name="version"/>
<property name="name"/>
...
</class>
</hibernate-mappin>
hibernate的 lazy(延迟加载):
lazy的策略可以用在:
● <class>标签上,可以去值:true/false
● <property>标签上,可以取:true/false,这个属性需要类增强工具
● <set><list>等集合上,可以去值:true/false/extra
● <one-to-one>和<many-to-one>(单端关联)等标签上,可以取:false/proxy/noproxy
概念:
● lazy是只有需要的时候才发出sql语句
● hibernate支持lazy策略,只有session打开状态才有效可以用 ThreadLocale和Filter->OpenSessionInView来解 决。
hibernate在class级别的lazy可以控制什么时候加载这些普通属性(property),但不能控制many-to-one one-to-many等。
hibernate在集合上的lazy策略,可以取值ture/false/extra (智能推荐)
hibernate在单端关联的lazy策略<one-to-one>和<many-to-one>,可以取值: false/proxy/noproxy(noproxy需要类增强工具)
◆ HQL查询
1 简单属性查询
●单个属性查询,返回结果集为单个属性的集合。
List students= session.createQuery("select name from Student").list();
//students 为name对应的类型String集合List<String>
for(Iterator iter=students.iterator();iter.hasNext()){
String name =(String)iter.next();
}
●多个属性查询,返回结果为对象数组的集合,对象数组的长度取决于查询属性的个数,类型取决于属性类型
List students = session.createQuery("select id,name from Student").list();
for(Iterator iter=students.iterator();iter.hasNext()){
Object[] objs=(Object[])iter.next();
}
●多个属性查询,用hql动态实例化对象返回
List students = session.createQuery("select new Strudent (id,name) from Student").list();
for(Iterator iter=students.iterator();iter.hasNext()){
Student student = iter.next();
}
●别名
List students = session.createQuery("select s.id, s.name from Student s").list();
或
List students = session.createQuery("select s.id, s.name from Student as s").list();
2 查询实体对象
●查询实体对象 可以忽略select,但如果用select了必须使用别名,hql不支持*,支持count(*)
List students = session.createQuery("from Student").list();
//List students = session.createQuery("select s from Student as s").list();
for(Iterator iter=students.iterator();iter.hasNext()){
Student student = iter.next();
}
●)n+1问题,在默认情况下使用query .iterate()查询,可能会引发n+1问题,所为n+1是指在查询
对象的时候发出了n+1条查询语句
1:首先发出查询实体对象id列表的sql
n:根据id在缓存中查询,如果缓存中有与之匹配的数据,那么就区缓存中的数据,否则依次根据id发出查询语句。
●)query.list()默认只往缓存中放不从缓存中读。
发出 select student0_.id as id1_,student0_.name as name1,.... from t_student as student0_
query.iterate(),会利用缓存读取查询,第一次查询 会发出n+1条select语句,1为先查id的sql语句,然后根据id 查
n为记录的总数,如果第2回就不会了....
select student0_.id as col_0_0_ from t_student as student0_
select student0_.id as col_0_0_,student0_.name as name1,.... from t_student as student0_ where student0_.id = ?
3 条件查询
可以拼HQL串,
List students = session.createQuery("select s.id ,s.name from Student s where s.name like '%1%'").list();
方法链编程,传递参数不需要''号
●采用?传递参数
List students = session.createQuery("select s.id ,s.name from Student s where s.name like ? ").setParameter(0,"%1% ").list();
●采用 :参数名传递
List students = session.createQuery("select s.id ,s.name from Student s where s.name like : myname
").setParameter("myname","%1%").list();
● 条件查询支持in ,通常用setParameterList来赋值
List students = session.createQuery("select s.id ,s.name from Student s where s.id in (:myids) ")
.setParameterList("myname",new Objects[]{1,3,5}).list();
●between
List students = session.createQuery("select s.id ,s.name from Student s where s.createTime
between ? and ? order by s.id ").setParameterList(0,mydateformat.parse("2008/08/01")).setParameterList(1,dateformat.parse("2008/08/25")).list();
●调用数据库的函数
List students = session.createQuery("select s.id ,s.name from Student s where date_format(s.createTime,'%Y-%m')=? order by s.id ")。setParameterList(1,"2008/08/25").list();
4 外置命名查询
● 在映射文件中采用<query>类定义hql
<hibernate-mapping>
<class name=...>
...
</class>
<query><![CDTA[
select s from Student s where s.di <?
]]>
</query>
</hibernate-mapping>
●在程序中使用session.getNamedQuery()方法来得到查询(query对象)
5 查询过滤器
●定义过滤器参数
●在类映射文件中使用过滤参数
●在程序中启用过滤器
<hibernate-mapping>
<class name=...>
...
<!--在类映射文件中使用过滤参数-->
<filter name="filtertest" condition="id < :myid " />
</class>
<!--定义过滤器参数-->
<filter-def name="filtertest">
<filter-param name="myid" type="integer">
</filter-def>
<hiberante-mappingapping>
//在程序中启用过滤器,并设置参数
session.enableFileter("filtertest").setParameter("myid",10);
6.hibernate3开始支持原生sql查询
//返回结果是对象数组的集合,顺序同数据库中表的顺序
session.createSqlQuery("select * from t_student").list();
for(Iterator iter=students.iterator();iter.hasNext()){
Object[] objs=(Object[])iter.next();
}
7分页查询
session.createQuery("from student").setFirstResult(0).setMaxResults(2).list();
8 对象导航查询 在hql中,使用.进行导航
session.createQuery("select s from student s where s.classes.id <5")
9 连接查询
●内连接
session.createQuery("select c.name, s.name from Student s join s.classes c").list();
●外连接(左连接/右连接)
左连接 把所有班级都显示出来
session.createQuery("select c.name, s.name from Classes c left join c.students s").list();
右连接 把所有学生都显示出来
session.createQuery("select c.name, s.name from Classes c right join c.students s").list();
10.统计查询
List students=session.createQuery("select count(*) from Student").list();
Long count = (Long)students.get(0);
Long count=session.createQuery("select count(*) from Student").uniqueResult();
session.createQuery("select c.name,count(s) from Student s join s.class c
group by c.name order by c.id").uniqueResult();
hibernate的一级缓存
一级缓存的生命周期和session一致,随着session的关闭而销亡。
●get/load/iterate(查询实体对象)使用一级缓存
一级缓存缓存的是实体对象。
如何管理一级缓存
●session.clear/session.evict
如何避免一次性大批量的实体数据插入
●先flush,在clear清除缓存
hibernate的二级缓存
二级缓存也是缓存实体类
二级缓存也称进程级缓存或叫SessionFactory级缓存,它可以被所有session共享
二级缓存的生命周期伴随SessionFactory的生命周期存在和销往
SessionFactory可以管理二级缓存
二级缓存的配置和使用:
●将ehcache.xml文件拷贝到src下
●在hibernate.cfg.xml中配置启用二级缓存,默认就是开启
<hibernate-configuration>
<session-factory>
...
<!--是否启用二级缓存-->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!--指定使用的二级缓存产品-->
<property name="hibernate.cache.EhCacheProvider_class"
</session-factory>
</hibernate-configuration>
●指定哪些实体类使用二级缓存
1)可以在hibernate.xml配置文件中定义
<class-cache class="xxx" usage="read-only"/>
2)可以在映射文件中配置缓存策略
<hibernate-mapping>
<class name="xxx">
<cache usage="read-only"/>
</class>
</hibernate-mapping>
●一二级缓存的交互,通过setCacheMode(Cache.Mode.GET)(PUT)默认读写
hibernate的查询缓存
查询缓存是针对普通属结果集的缓存
对实体对象的结果集只缓存主键id.
查询缓存的生命周期,当查询关联的表发生修改,那么查询缓存的生命周期结束。
查询缓存的配置和使用:()
在hibernate.cfg.xml文件中加入
<property name="hibernate.cache.use_query_cache">true</property>
在程序中显式开启查询缓存
query.setCacheable(true);
说明:转义字符应以“&”开头,以“;”结尾。
HTML常用转义字符:
字符 |
转义字符 |
描述 |
& |
& |
和 |
< |
< |
小于号 |
> |
> |
大于号 |
" |
" |
双引号 |
|
|
空格 |
© |
© |
版权符 |
® |
® |
注册符 |
XML常用转义字符:
字符 |
转义字符 |
描述 |
& |
& |
和 |
< |
< |
小于号 |
> |
> |
大于号 |
" |
" |
双引号 |
' |
' |
单引号 |
相关推荐
Hibernate学习笔记整理 以下是 Hibernate 框架的详细知识点: Hibernate 介绍 Hibernate 是一个 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到数据库表中。它提供了一个简洁的方式来访问和操作...
创建一个简单的Hibernate应用通常涉及以下步骤:配置Hibernate环境(包括hibernate.cfg.xml文件),创建实体类,编写映射文件,以及编写Session工厂和Session的代码。一个基本的增删查改操作可以展示其简洁的API使用...
【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本笔记将详细阐述Hibernate的核心概念、使用方法和特性。 一、...
3. **Hibernate基础配置**:配置文件`hibernate.cfg.xml`是Hibernate应用的基础,包含了数据库连接信息、方言设置、缓存配置等内容。其中,ID生成策略(如.AUTO)用于指定主键如何自动生成,是配置中的重要部分。 4...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库。这个框架将数据库操作转化为对Java对象的操作,...通过上述步骤,你可以更好地了解和应用Hibernate进行数据库操作。
### Hibernate映射笔记详解 #### Hibernate映射文件与配置关系 Hibernate映射是ORM(对象关系映射)框架中的一项关键技术,它允许开发者在数据库表和Java对象之间建立映射关系,从而简化了数据访问层的开发工作。...
《Hibernate入门:第一天笔记详解》 Hibernate,作为Java领域中著名的ORM(Object-Relational Mapping)框架,极大地简化了数据库操作,让开发者可以更加专注于业务逻辑而不是底层的数据访问。本文将基于第一天学习...
在深入探讨《hibernate笔记.txt》所提及的关键知识点前,我们先来解析一下标题和描述中的核心概念。“自上而下的依赖,单向依赖,层与层之间最好依赖抽象”,这一描述实际上触及了软件架构设计中的关键原则,特别是...
### Hibernate实战笔记——深入解析对象关系映射与优化策略 #### 一、对象关系映射(ORM)概念 - **什么是持久化**:在计算机科学领域,“持久化”指的是将程序的数据状态保存到非易失性的存储介质中,以便可以在...
在BBS2007这样的应用中,我们可以看到如何将Hibernate的查询能力融入到实际业务逻辑中,提高开发效率。 性能优化是任何系统都不能忽视的一环。Hibernate提供了缓存机制、批处理、延迟加载等优化手段,通过合理配置...
### 马士兵Java框架Hibernate学习笔记 #### 一、HelloWorld - **知识点概述**: - **项目搭建**:介绍了如何从零开始搭建一个简单的Hibernate项目。 - **环境配置**:包括了如何配置MySQL数据库、创建必要的表...
【传智播客 Hibernate 笔记】是一份深入学习 Hibernate ORM 框架的资源集合,包括了 word 笔记、pdf 讲义、源代码以及相关分析图表和 jar 包,旨在帮助开发者全面理解并掌握 Hibernate 的核心概念与实际应用。...
### Hibernate 学习笔记知识点概览 #### 一、Hibernate 概述 - **定义**:Hibernate 是一款开源的对象关系映射(ORM)框架,它实现了将 Java 应用程序中的对象模型映射到关系型数据库中的记录。通过 ORM 技术,...
这份笔记涵盖了从基础到高级的Hibernate应用,包括配置、实体管理、查询语言、缓存策略等多个方面,旨在帮助读者深入理解和熟练运用Hibernate。 首先,笔记可能从Hibernate的核心概念开始介绍,如Entity(实体)、...
9. 性能优化:最后,笔记会探讨一些Hibernate的性能优化技巧,如批处理、缓存策略、延迟加载的合理使用等,以提高应用程序的运行效率。 总之,《韩顺平.2011版.hibernate笔记》全面地介绍了Hibernate的各个方面,...
**Hibernate 全部笔记** Hibernate 是一款开源的Java平台上的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式来处理数据库事务。本笔记将深入探讨Hibernate的核心概念、...