Day04
总结:
一、一对一的关联关系映射(外键 + 唯一)
基于外键的
有外键方:<many-to-onename="obj" class=".." column=".."unique="true"/>
无外键方:<one-to-onename=".." class=".." property-ref="obj"/>
基于主键的
有外键方:<one-to-one...>
无外键方:<one-to-one...>
操作:
在采用基于外键的方式时:只有有外键方可以维护关联关系。
在采用基于主键的方式时:双方都不可以维护关系。
二、继承结构映射
1,整个继承结构使用一张表。列上不能有not-null="true"。
2,每个类对应一张表,抽象类也对应表。
3,每个具体类对应一张表,抽象类不对应表。
三、HQL语句
与SQL的语法类似。
HQL查询的对象、属性,所以写的时候写的是类名、属性名。
HQL的关键字不区分大小写,类名与属性名区分大小写。
语法:
SELECT 别名/属性名/表达式
FROM 实体 AS 别名
WHERE 过滤条件
ORDERBY 排序条件
SELECT 别名/属性名/表达式
FROM 实体 AS 别名
WHERE 过滤条件
GROUPBY 分组条件
HAVING 分组后的结果的过滤条件
ORDERBY 排序条件
懒加载:
也叫延迟加载,不是在执行获取操作时马上生成SQL,而是在第一次使用时生成SQL。
分成两种:
类级别的:
<class... lazy="true/false">
属性级别的:
<set/list/map/bag... lazy="...">
<many-to-one... lazy="...">
<one-to-one... lazy="...">
在使用懒加载特性时,可能会有LazyInitializationException异常:
原因:
真正的去获取数据时,Session已经没有了。
解决办法:
方式一:让Session在真正加载后再关闭。
方式二:或是在Sessoin关闭前执行Hibernate.initialize(department.getEmployees());
数据库连接池
需要导入特定的jar包:在主配置文件中配置数据库连接池的信息。
<!-- C3P0连接池设定-->
<!-- 使用c3p0连接池 配置连接池提供的供应商-->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider </property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">20</property>
二级缓存
<!-- 使用二级缓存,默认是未打开的。 -->
<!-- 指定要使用的缓存的提供商,这也就打开了二级缓存
<property name="cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
-->
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<!-- 开启使用查询缓存 -->
<property name="cache.use_query_cache">true</property>
<!-- 指定要使用二级缓存的实体类 -->
<class-cache usage="read-write"class="cn.itcast.l_second_cache.Employee"/>
<class-cache usage="read-write"class="cn.itcast.l_second_cache.Department"/>
<collection-cache usage="read-write"collection="cn.itcast.l_second_cache.Department.employees"/>
映射关系模板
一对多(set)
<set name = …>
<key column=…/>
<one-to-many class=…>
</set>
多对一:
<many-to-one name=… class=… column=…/>
多对多:
<set name=… table=…>
<key column=…/>
<many-to-many calss=… column=…/>
</set>
一对一(基于外键的有外键方):
<many-to-one name=… calss=… column=…unique=”true”/>
一对一(基于外键的无外键方)
<one-to-one name=… class=… property-ref=…/>
填空:
Name属相:填当前属性名称
Class:当前属性所的类名称
Column:在many-to-one中:就写name的值加上id后缀
在一对多的key中,写对方类的表达这个关系的外键列名
多对多的key 中:写自己类的名称加上id后缀
在多对多的many-to-many中写对方类加上id后缀。
Property-ref:对方name的值。