02_Hibernate持久化配置
一.hibernate对象持久化
Web开发的分层: 为了把数据访问细节和业务逻辑分开, 一般把数据访问作为单独的持久化层。DAO是数据访问对象,使用hibernate后,数据访问对象中操作的API将是持久化工具hibernate的API。

二.hibernate.cfg.xml文件可选配置
hibernate.show_sql true 在控制台上输出SQL语句
hibernate.format_sql true 格式化控制台输出的SQL语句
hibernate.hbm2ddl.auto create/create-drop/update/validate
* create :每次执行的时候,创建一个新的表.(如果以前有该表,将该表删除重新创建.) 一般测试的时候的使用.
* create-drop:每次执行的时候,创建一个新的表,程序执行结束后将这个表,删除掉了. 一般测试的时候使用.
* update :如果数据库中没有表,创建一个新的表,如果有了,直接使用这个表.可以更新表的结构.
* validate:会使用原有的表.完成校验.校验映射文件与表中配置的字段是否一致.不一致报错.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- 核心配置文件 hibernate.cfg.xml 连接数据库 关联映射 引入xml-->
<session-factory>
<!-- 连接数据库 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/crm?characterEncoding=utf-8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<!-- 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 是否在制台显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- 引入映射文件 -->
<mapping resource="com/icss/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
三.*.hbm.xml文件可选配置
hibernate-mapping:hibernate配置文件的根标签,可包含class等子标签。
常用属性说明:
package:如果在一个映射文件中包含多个class,并且这些类位于同一个包中,可以设置<hibernate-mapping>元素的package属性,避免为每个类提供完整的类名.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping><!-- 可选package:-->
<class name="com.icss.entity.User" table="sys_user">
<id name="userid" column="user_id" type="integer">
<generator class="native"></generator><!--主键的生成策略 -->
</id>
<property name="usercode" column="user_code" type="string"></property>
<property name="username" column="user_name" type="string"></property>
<property name="userpassword" column="user_password" type="string"></property>
<property name="userstate" column="user_state" type="string"></property>
</class>
</hibernate-mapping>
class :标签配置
class:用于配置持久化类与数据表关系的标签,子元素为持久化对象属性与数据库字段的关系映射。
属性说明:
mutable:是否可变,true/false,默认true。如设定为false,则无法完成数据修改功能。
dynamic-insert:是否动态插入,true/false,默认false,如设定为true,hibernate在插入数据时,首先检测内存对象,过滤为空的属性,生成的sql语句不包含为空的字段。
dynamic-update:是否动态修改,true/false,默认false,如设定为true,hibernate在更新数据时,首先检测内存对象,过滤为空的属性,生成的sql语句不包含为空的字段。
lazy:是否延迟加载,true/false,默认true。
property标签配置
property:用于配置持久化类属性与数据表字段的映射关系标签。
常用属性说明:
name:持久化类的属性名称。
column:数据库表的字段名。
type :字段类型。
access:属性访问方式,有三种配置方式。
formula:用来设置一个sql表达式,hibernate将根据它来计算出派生属性的值。
insert:是否可插入,true/false,默认true,如设定为false,hibernate完成插入数据操作时,不处理该字段。
update:是否可修改,true/false,默认true,如设定为false,hibernate完成数据更新操作时,不处理该字段。
lazy:是否延迟加载,true/false,默认true
property-type:属性说明

映射类型字段说明:

access: Hibernate访问持久化类属性的策略
• property默认值:表明hibernate通过getXXX和setXXX来访问类属性。推荐使用。
• field:hibernate通过java反射机制直接访问类属性。对于没有javabean方法的属性可设置该访问策略。
noop(了解):它映射Java持久化类中不存在的属性,即主要用于HQL(用query接口测试,使用hql语句)中,当数据库中有某列,而实体中不存在的情况。

property-formular属性说明:
formula :用来设置一个sql表达式,hibernate将根据它来计算出派生属性的值。
派生属性:数据库表中不包含此字段,但因为业务逻辑需要,持久化对象需要的额外字段,例如数据库中保存的是日期格式的出生日期,但需要获取的是年龄。
在PersonDetail类中增加年龄属性。
private int age;//在数据库中没有对应的列
在PersonDetail.hbm.xml文件中增加如下配置
<property name="age“
formula="(select months_between(sysdate,birthday)/12 from dual)"></property>
Hibernate在处理派生属性时,就是在sql语句中增加了派生属性对应的sql语句。select 。。。formulaSql from 。。。。
hibernate主键配置
区分数据表中数据的方式。
数据表中的主键:
在关系数据表中,用主键来识别记录并保证每条记录的唯一性,因此,作为主键的字段必须满足如下条件:
不允许为空。
每条记录具有唯一的主键值,不能重复。
每条记录的主键值不会改变。
数据表中的主键可分为:
•自然主键:具有业务含义的字段,例如在PERSON_DETAIL表中把name作为主键(要靠程序控制该字段满足以上条件)。
•代理主键:不具备含义的字段,一般取名为xxxx_id,代理主键一般采取整数类型,因为整数类型要比字符类型节省更多的数据库空间,很多数据库都提供了生成代理主键的机制。
区分数据表中数据的方式
不同关系数据库的主键生成机制:
•my SQL数据库:把字段设为auto_increment类型,数据库会自动为主键赋值。
•SQL server中数据库:把字段设为identity类型,数据库会自动为主键赋值。
•Oracle数据库:从序列(sequence)中获取自动增长的描述符。
创建序列:
create sequence seq_person increment by 2 start with 1
使用序列:
insert into customers values(seq_person.currval,’..’)
OID配置方式:

increment 生成器:由 Hibernate 以递增的方式为代理主键赋值

适用范围:
- 由于 identity 生成标识符的机制依赖于底层数据库系统, 因此, 要求底层数据库系统必须支持自动增长字段类型. 支持自动增长字段类型的数据库包括: DB2, Mysql, MSSQLServer, Sybase 等,ORACLE不支持自增主键生成。OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
- sequence 生成器:利用底层数据库提供的序列来生成标识符。

Hibernate 在持久化一个 News 对象时, 先从底层数据库的指定序列中获得一个唯一的标识号, 再把它作为主键值。
适用范围:
- 由于 sequence 生成标识符的机制依赖于底层数据库系统的序列, 因此, 要求底层数据库系统必须支持序列. 支持序列的数据库包括: DB2 Oracle 等,OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
- assigned 生成器:将持久化对象的id值作为OID

适用范围:
•适用于数据表的主键为自然主键,或不使用hibernate的OID生成机制,使用自己封装的主键生成机制。
•在存储对象前,必须要使用主键的setter方法给主键赋值,至于这个值怎么生成,完全由自己决定,这种方法应该尽量避免。
uuid 生成器:Hibernate会产生不重复的32位字符串作为主键

UUID:Universally Unique Identifier,是指在一台机器上生成的数字。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字,标准的UUID格式为:
xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。
Hibernate在保存对象时,生成一个UUID字符串作为主键,保证了唯一性,但其并无任何业务逻辑意义,只能作为主键,唯一缺点长度较大,32位(Hibernate将UUID中间的“-”删除了)的字符串,占用存储空间大,但是有两个很重要的优点,Hibernate在维护主键时,不用去数据库查询,从而提高效率,而且它是跨数据库的,以后切换数据库极其方便
property- formula属性说明
property-p formula属性说明
pproperty- formula属性说明roperty- formula属性说明
02_Hibernate持久化配置的更多相关文章
- Redis 该选择哪种持久化配置
这个标题或许会让你想起<黑客帝国>里经典的台词,你要选择蓝色药丸,还是红色药丸? Redis 是我们重度使用的一个开源软件,对它的持久化配置做一番相对深入的总结,是值得的.目前它有两种主流 ...
- Docker下redis的主从、持久化配置
Docker下redis的主从.持久化配置 redis是k-v型nosql数据库,支持字符串(string).列表(list).集合(set).散列(hash).有序集合(zset:形如member: ...
- redis之 Redis持久化配置
Redis持久化配置 Redis的持久化有2种方式 1快照 2是日志 Rdb快照的配置选项 save 900 1 // 900内,有1条写入,则产生快照 save 300 1000 ...
- redis07-----Redis持久化配置
Redis持久化配置 持久化: 即把数据存储于断电后不会丢失的设备中,通常是硬盘. 常见的持久化方式: 主从:通过从服务器保存和持久化,如mongoDB的replication sets配置. 淘宝是 ...
- redisd的非持久化配置
如何关闭redis持久化?我的需求是只把redis当作缓存来用,所以持久化到硬盘对我的需求来说没有意义. 修改redis配置文件,redis.conf 第115行左右. 1.注释掉原来的持久化规则 # ...
- redis RDB快照和AOF日志持久化配置
Redis持久化配置 Redis的持久化有2种方式 1快照 2是日志 Rdb快照的配置选项: save 900 1 // 900内,有1条写入,则产生快照 save 300 1000 ...
- SpringBoot整合任务调度框架Quartz及持久化配置
目录 本篇要点 SpringBoot与Quartz单机版快速整合 引入依赖 创建Job 调度器Scheduler绑定 自动配置,这里演示SimpleScheduleBuilder 手动配置,这里演示C ...
- apscheduler(定时任务) 基于redis持久化配置操作
apscheduler(定时任务) 基于redis持久化配置操作 安装模块 pip install apscheduler 导入模块配置 ## 配置redis模块 from apscheduler.j ...
- redis持久化配置
redis有rdb和aof两种持久化方式: rdb 默认方式,配置文件中相关的有: save 900 1 #900秒一次,若有1个或以上key修改则save一次,以下相同 save 300 10 sa ...
随机推荐
- Eclipse指定JDK版本
Eclipse有好多版本,同时又分32位和64位,要使用相对应的版本和一样位数的JDK,Eclipse才能正常运行. 对应不上时,Eclipse 甚至不能正常启动.报错:“Failed to load ...
- WebApi 路由机制剖析
阅读目录 一.MVC和WebApi路由机制比较 1.MVC里面的路由 2.WebApi里面的路由 二.WebApi路由基础 1.默认路由 2.自定义路由 3.路由原理 三.WebApi路由过程 1.根 ...
- 结对编程收获-Core10组-PB16110698
本周结对编程追加作业:记录收获.坦白说,我的收获多而杂,一时不知从何说起,以下试图从各方面简要谈谈. 一.编程能力收获 从编程能力方面,我收获的主要是类的设计思路和算法设计.在作业要求blog的指引下 ...
- adb命令 logcat日志抓取
一.logcat抓log方法:adb logcat命令,可以加条件过滤 1.安装SDK(参考android sdk环境安装) 2.使用数据线链接手机,在手机助手的sdcard中建立一个1.log的文件 ...
- Java 多线程 - 锁的类型
https://zhuanlan.zhihu.com/p/37287566 https://www.cnblogs.com/qifengshi/p/6831055.html
- [JZOJ6344] 【NOIP2019模拟2019.9.7】Huge Counting
题目 题目大意自己看题去-- 正解 比赛时在刚第二题,所以根本没有时间思考-- 模型可以转化为从\((x_1,x_2,..,x_n)\)出发到\((1,1)\)的方案数模\(2\). 方案数就用有重复 ...
- 「题解」:$Simple$
问题 A: $Simple$ 时间限制: 1 Sec 内存限制: 256 MB 题面 题面谢绝公开. 题解 不算数学的数学题?? 直接枚举会重.$60%$两种算法:1.无脑$vis$数组记录.2.$ ...
- BZOJ 4557 (JLOI 2016) 侦查守卫
4557: [JLoi2016]侦察守卫 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 493 Solved: 342 [Submit][Status ...
- maven项目引入外部第三方jar包,引入、本地编译、第三方jar一起打到jar中、在linux机器中解决classnotfound(配置classpath),笔记整理。
文章目录 引用的第三方jar的目录结构(示例) 引入第三方jar进行dependency使项目内能import 本地编译 第三方jar一起打到jar中 在linux机器中解决classnotfound ...
- day 80 Vue学习一之vue初识
Vue学习一之vue初识 本节目录 一 Vue初识 二 ES6的基本语法 三 Vue的基本用法 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 vue初识 vue称为渐进式js框架 ...