Hibernate 单独使用总结

1.Hibernate总配置文件相关属性说明:

	<session-factory >
		<!-- mysql数据库驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- mysql数据库名称 -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/wode</property>
		<!-- 数据库的登陆用户名 -->
		<property name="hibernate.connection.username">root</property>
		<!-- 数据库的登陆密码 -->
		<property name="hibernate.connection.password">newmobile</property>
		<!-- 方言:为每一种数据库提供适配器,方便转换 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
	    	<!--选择标准的sql打印在控制台-->
	    	<property name="hibernate.show_sql" >true</property>
	    	<property name="hibernate.format_sql" >true</property>
	    	<!--自动建表-->
	    	<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 映射文件 -->
		<mapping resource="com/ssh/entity/User.hbm.xml"/>
		<mapping resource="com/ssh/entity/ClassInfo.hbm.xml"/>
		<mapping resource="com/ssh/entity/Student.hbm.xml"/>
	</session-factory>


➀. dialect就是“方言”,因为hibernate是要把Java对象转换成关系数据库来描述的,而关系数据库虽然有一些统一的标准,如SQL-92等,但是实际上各数据库如Oracle, MySQL, MS SQL Server等等为了提高性能或增加功能都提供了一些额外的标准或语法,因此,hibernate为了更好适配各种关系数据库,针对每种数据库都指定了一个方言dialect。

你可以看到hibernate里面实际上方言只是一个类,它里面将不同数据类型、SQL语法转换成hibernate能理解的统一的格式。但注意,如果没有对应的dialect,Hibernate是无法使用这种数据库进行对象关系转换的

➁.从设置项的英文字就可以看出该配置的作用:显示Hibernate中操作的sql语句,而format_sql自然就是对该sql语句进行格式化了。

➂.hibernate.hbm2ddl.auto一共有4个选项,分别是:

(1)create-drop

表示在hebarinate初始化时创建表格,程序运行结束的时候会删除相应的表格,在实际项目中不用

(2)create

在hibernate初始化时会创建表格,在运行结束之后不删除表格,而是在下一次运行的时候如果有旧的删掉,没有旧的,重新建表格

(3)update

只是根据映射文件去和数据库中的表对应起来,如果不一致,就更新表的结构

(4)validate

校验映射文件和数据库中的表是不是能对应起来,不能对应报错,实际中常用

2.Hibernate 缓存相关:

一级缓存:

Hibernate 一级缓存又称为"Session的缓存"。
Session内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的声明周期通常对应一个数据库事务或者一个应用事务)
一级缓存中,持久化类的每一个实例都具有唯一的OID。Session缓存是实体级别的缓存,就是只有在查询对象级别的时候才使用,如果使用HQL或者SQL,是不能应用一级缓存的!切记!!!

二级缓存:

Hibernate二级缓存又称为“SessionFactory的缓存”。
由于SessionFactory对象的生命周期和应有程序的整个过程是对应的,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。
第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。
Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件和Hibernate之间的适配器。

什么样的数据适合放在二级缓存?
1.很少被修改的数据
2.不是很重要的数据,允许偶尔的并发的数据
3.不会被并发访问的数据
4.常量数据

3.Hibernate抓取策略:

Hibernate的抓取策略的应用场景是配置one-to-many、many-to-one的关联关系的时候,Hibernate采用哪种方式来获取相应的关联项

1).对应单端代理的批量抓取fetch=select(默认)/join

<many-to-one name="XXX" column="xxxx" fetch="select(默认)" />
fetch="select" 另外发送一条select语句抓取当前对象关联实体或者集合
<many-to-one name="XXX" column="xxxx" fetch="select(默认)" />
fetch="join" Hibernate会通过select语句使用外连接来加载其关联的实体或者集合

2).集合代理(多端代理)的抓取fetch=select(默认)/join/subselect)

<set name="xxx" inverse="true" fetch="select" >
fetch="select"与fetch="join" 意义同单端代理雷同,所以不单独解释了
fetch="subselect" 另外发送一条select语句抓取前面查到的所有实体对象的关联集合(嵌套子查询)

归结:

(该结论不一定适用于所有情况,单到目前来看,我所遇到的情况都可以解释) join只能用于get和load方法[亦即获取单条数据]的时候才会做连接查询,subselect则会把一端查询的结果作为多端的嵌套查询条件裹入in语句。


<many-to-one name="XXX" column="xxxx" fetch="select(默认)" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值