Hibernate缓存、组件、继承映射
三种状态:
临时状态:不受session管理,没有提交到数据库;没有执行sql之前,new对象的时候;
持久化状态:受session管理,提交到数据库;正在执行sql
游离状态:不受session管理,提交到数据库;session关闭后
Cache缓存:会先看看缓存里有没有,有就取出来,没有就到数据库取数据。
Session的三个方法:flush、evict、clear
不同session不会共享数据。
List与iterator的区别:
List是直接到数据库进行查询,也会放到缓存,但是不会到缓存取数据;
Iterator是到数据库取数据也放到缓存,会到缓存取数据。
Get和load的区别:
Get是及时查询,直接一个select出来;
Load默认是懒加载,使用到数据的时候才会到数据库取数据。会先到数据库取主键,然后根据主键一个一个遍历。
Lazy=true、false、extra(真正使用到数据的时候才回到数据库取数据,像isEmpty、size都不会到数据库取数据)
一对一映射:
<generator class=”foreign”>
<param name=”property”>引用的对象</
<id name="user_id">
<!--
id 节点指定的是主键映射, 即user_id是主键
主键生成方式: foreign 即把别的表的主键作为当前表的主键;
property (关键字不能修改)指定引用的对象 对象的全名 cn..User、 对象映射 cn.User.hbm.xml、 table(id)
-->
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<!--
一对一映射,有外键方
(基于主键的映射)
constrained="true" 指定在主键上添加外键约束
-->
<one-to-one name="user" class="User" constrained="true" cascade="save-update"></one-to-one>
组件映射
<!-- 组件映射 -->
<component name="wheel">
<property name="size"></property>
<property name="count"></property>
</component>
继承关系的映射
简单映射:
可以直接使用父类的属性;
获取时候注意:当写hql查询的使用,通过父类查询必须写上类的全名
每个类都对应一张表:(包括父类在内)
每个子类都这么写:
<joined-subclass name="Cat" table="t_cat">
<key column="t_animal_id"></key>
<property name="catchMouse"></property>
</joined-subclass>
每个类都对应一张表:(包括父类不在内)
需要将父类:abstract=”true” <class name="Animal" abstract="true">
abstract="true" 指定实体类对象不对应表,即在数据库段不生成表
<union-subclass name="Cat" table="t_cat">
<property name="catchMouse"></property>
</union-subclass>
注意:主键不能是自增长!可以用uuid,父类id要为String类型