hibernate文件配置和注解配置
##hibernate文件配置和注解配置<br>
<font color=red size=6> 一对多</font><br>
- 车主和自行车表<br>
-
<!--车主实体类 车集合-->
<set name="bikeSet" cascade="save-update" >
<!-- 利用从表的哪个外键,关联主表 -->
<key column="nameId"></key>
<!-- 设置集合中存放的元素类型 -->
<one-to-many class="com.project.bean.BikeBean"/>
</set>
<!--车实体类 车主对象-->
<!-- lazy="false" 表示消除延迟加载,查询从表记录时,马上查询主表记录 -->
<many-to-one lazy="false" name="man" class="com.project.bean.ManBean" column="nameId"></many-to-one>
- 注解配置 一对多
-
<!--车主实体类 车集合-->
@OneToMany(targetEntity=BikeBean.class)//配置一对多,targetEntity配置集合存放元素的类型
@JoinColumn(name="nameId")//配置从表外键列名
<!--车实体类 车主对象-->
@ManyToOne(fetch=FetchType.EAGER)//配置多对一,同时申明关联对象为立即加载
@JoinColumn(name="nameId")
<font color=red size=6> 多对多</font><br>
- 用户和角色表<br>
-
<!--用户实体类 角色集合-->
<!-- 多对多 需要在set标签中加上 table属性 中间表的表名 -->
<set name="roleSet" table="t_role_user" >
<!-- 当前实体类,对应的中间表的外键 -->
<key column="userId" ></key>
<!-- class表示集合中存放元素类型,colum表示集合中存放的元素对应中间的外键 -->
<many-to-many class="com.project.bean.RoleBean" column="roleId"></many-to-many>
</set>
<!--角色实体类 客户集合-->
<set name="userSet" table="t_role_user">
<key column="roleId"></key>
<many-to-many class="com.project.bean.UserBean" column="userId"></many-to-many>
</set>
- 注解配置 多对多
-
<!--用户实体类 角色集合-->
@ManyToMany(targetEntity=RoleBean.class)//配置多对多。指明元素类型
@JoinTable(
name="t_role_user",//中间表名
joinColumns={@JoinColumn(name="userId")},//当前对象映射中间表的外键列名
inverseJoinColumns={@JoinColumn(name="roleId")}//集合中的元素对应中间的外键
)
private Set<RoleBean> roleSet=new HashSet<>();
hibernate注解配置
@Entity //表示该类为实体类,可以通过注解操作
@Table(name="t_school") //该类和数据库中的哪个表做映射
public class SchoolBean {
}
@Id //标识主键属性
@GeneratedValue(strategy=GenerationType.IDENTITY) //主键生成策略
private int id;
属性和列名不一致的时候
@Column(name="schoolName")
private String name;
@Transient表示该属性并非一个到数据库表的字段的映射
oracle注解添加主键生成策略
@id
@sequenceGenerator(name="seq",allocationSize=1,initialvalue=1,sequenceName="S_AUTOID")
@GeneratedValue(strategy=GenerationType.SEQENCE,generator="seq") //主键生成策略
- 文件配置和注解配置映射也会改变在hibernate.cfg.xml中
-
<mapping resource="orm/StudentBean.hbm.xml"/>变成 <mapping class="com.project.bean.SchoolBean"/>
##缓存分类
- 一级缓存:即在当前事务范围内的数据缓存;就hibernate而言,session一旦关闭,一级缓存就清除,一级缓存为hibernate自带的缓存,是必须的
- (应用级)二级缓存:即在某个应用中或应用某个独立数据库访问子集中的共享缓存,此缓存可以由多个事务共享。就hibernate中,二级缓存由sessionfactory管理。
- 分布式缓存:即在多个应用实例,多个JVM间的共享缓存策略。
- 二级缓存
使用第三方缓存组件;EHcache、Oscache作为Hibernate
<!-- 指明二级缓存产品 -->
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>
<!-- 配置schoolBean需要的二级缓存 -->
<class-cache usage="read-write" class="com.project.bean.SchoolBean"/>
##所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作;
- Hibernate的延迟加载
- 延迟加载类型
- 1.实体对象的延迟加载
- 2.集合的延迟加载(一对多和多对多时,关联集合)
- 3.属性的延迟加载(clob大数据类型时)
- 属性延迟加载
- Clob 大数据文本
- Blob 存放大数据的二进制数据
##数据库连接池:(为什么要使用连接池,因为数据库每次访问都建立一次链接,每次数据库链接后,都需要断开,不能控制被创建的链接对象。)
- 不用连接池的弊端:
1.流的操作频繁 2.不能控制链接数量
##连接池作用:
- 解决资源的频繁分配,防止系统无休止的数据库连接,监视数据库的连续的数量、使用情况、为系统开发、测试及性能调整提供数据。
- 连接池的工作原理;
当DAO需要链接对象时,从连接池中找到状态为空闲的连接,分配给操作用户。
如果连接池中没有空闲连接,这里就需要检查连接池中,连接数量是否达到最大连接数量。没有到达最大连接数,那么新建连接对象,放入连接池,分配给操作用户。
如果已经达到最大连接数,那么操作用户就等待一段时间,这段时间之内,如果有连接被释放,那么分配给等待用户。超过这段时间,那么久返回null。
配置连接池
<!-- 连接池 -->
<!-- 最大连接数 -->
<property name="hibernate.dbcp.ps.maxActive">100</property>
<!-- 最小连接数 -->
<property name="hibernate.dbcp.ps.maxIdle">20</property>
<!-- 超时时间 -->
<property name="hibernate.dbcp.ps.maxWait">300</property>
##悲观锁
- 实现依赖于数据库机制,在整个过程中,将数据锁定,其他任何用户不能对其读取和修改,一般适用于短事务,并发性不好。
##乐观锁
1. 乐观锁依靠数据版本记录机制实现
2.位数据增加一个版本标识,增加一个version字段
3.读取数据时,将版本号一同读书
4.更新时,版本号加一
5.将提交数据的版本与数据库表对应记录的当前版本信号进行比对
6.如果提交的数据版本号大于数据库当前版本号,则更新,否则认为是过期版本。
##hibernate常见的优化策略
1.用高版本的hibernate;
2.制定合理的缓存策略;
3.采用合理的session机制;
4.尽量使用延迟加载;
5.如有可能,采用UUID作为主键生成策略;
6.如果有可能,选用乐观锁代替悲观锁;
7.在开发中,显示hibernate执行的SQL语句。从而制定更好的实现策略;
8.复杂查询和统计查询可以使用SQL语句完成,设置可能可以考虑使用存储过程完成。
浙公网安备 33010602011771号