? 在面向对象中很重要的一个特性就是继承,继承实现了代码的复用,Hibernate也支持继承映射
? Hibernate支持三种继承映射方式:
? 系统有三个角色:系统用户、管理员、普通用户
create table t_sysUser(
id int primary key auto_increment,
username varchar(200),
password varchar(200),
tel varchar(50),
address varchar(200),
type int -- 0 manager, 1 member
)engine Innodb default charset=utf8;
<!--
指定如何区分子类
column:指定使用哪个字段来区分
注:根据dtd约束规则,该元素要放到property元素的前面
-->
<discriminator column="type"></discriminator>
<property name="username"></property>
<property name="password"></property>
<!--
每个子类的配置
-->
<subclass name="Manager" discriminator-value="0">
<property name="tel"></property>
</subclass>
<subclass name="Member" discriminator-value="1">
<property name="addr"></property>
</subclass>
create table t_manager(
id int primary key auto_increment,
username varchar(200),
password varchar(200),
tel varchar(50)
)engine Innodb default charset=utf8;
create table t_member(
id int primary key auto_increment,
username varchar(200),
password varchar(200),
addr varchar(200)
)engine Innodb default charset=utf8;
<class name="Manager" table="t_manager">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="username"></property>
<property name="password"></property>
<property name="tel"></property>
</class>
create table t_sysUSer(
id int primary key auto_increment,
username varchar(200),
password varchar(200)
)engine Innodb default charset=utf8;
create table t_manager(
id int primary key auto_increment,
tel varchar(30),
user_id int,
foreign key(user_id) references t_sysUser(id)
)engine Innodb default charset=utf8;
create table t_member(
id int primary key auto_increment,
addr varchar(200),
user_id int,
foreign key(user_id) references t_sysUser(id)
)engine Innodb default charset=utf8;
<!--
通过外键关联的子类
-->
<joined-subclass name="Manager" table="t_manager">
<!-- 关联列,外键列 -->
<key column="user_id"></key>
<!-- 包含的属性 -->
<property name="tel"></property>
</joined-subclass>
<joined-subclass name="Member" table="t_member">
<!-- 关联列,外键列 -->
<key column="user_id"></key>
<!-- 包含的属性 -->
<property name="addr"></property>
</joined-subclass>
? Hibernate缓存可以为三类:
? 一级缓存就是Session范围内的缓存,也称为Session缓存,Session自带
? 作用:
保证数据库中的数据与缓存中的对象同步
管理Session的方法:
? 二级缓存是SessionFactory范围内的缓存,可以被所有Session所共享
? 二级缓存需要单独配置缓存插件,常用的二级缓存插件:EHCache、OSCache、JBossCache...
? 配置二级缓存的步骤:
添加lib\optional\ehcache目录下的jar包
在类路径下创建ehcache.xml文件并配置
在hibernate.cfg.xml文件中开启二级缓存并设置使用的二级缓存的实现类
<!-- 启用二级缓存 -->
<property name="cache.use_second_level_cache">true</property>
<!-- 设置二级缓存的实现类,即指定使用的插件 -->
<property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
指定要缓存的对象
<!-- 指定二级缓存的实体类 -->
<class-cache usage="read-write" class="day04.cache.Account"/>
? 默认二级缓存只针对基于ID的查询有效,如get()、load(),默认对HQL查询无效,因此提供了针对非ID查询的缓存,称为查询缓存
? 查询缓存是基于二级缓存的,必须先配置二级缓存
? 配置查询缓存的步骤:
在hibernate.cfg.xml文件中开启查询缓存
<property name="cache.use_query_cache">true</property>
使用查询缓存
String hql="from Account a where a.name like :name";
Query query=session.createQuery(hql).setString("name", "%m%");
query.setCacheable(true); //使用查询缓存
System.out.println(query.list());
注:只有当执行的hql语句完全相同时才会使用查询缓存
适用场景:
? 传统上Hibernate的配置依赖于xxx.hbm.xml文件,需要在映射文件中指定实体对象和数据库表之间的关系,并且在启动时加载
? 使用Hibernte注解,可以将映射信息写入到Java类中,不再需要xxx.hbm.xml文件,简化开发
? Java Persistence API,Java持久化API
? JPA和Hibernate的关系:JPA是标准接口,Hibernate是实现,功能更加强大
注解 | 含义和作用 |
---|---|
@Entity | 将一个类声明为持久化类 |
@Table | 为持久化类映射指定的表 |
@Id | 声明持久化类的标识属性 |
@GenerateValue | 主键生成策略 |
@Column | 将属性映射到列 |
@NamedQuery | 配置命名 |
注解 | 含义和作用 |
---|---|
@OneToMany | |
@OneToOne | |
@ManyToOne | |
@ManyTo |
? 步骤:
?
原文:http://blog.51cto.com/12402007/2159437