hibernate项目学习(二)
hibernate持久化
-
简介
在hibernate事务中,实体类对象有3种状态,分别是瞬时状态,持久化状态以及游离状态(又称托管状态),
当实体类对象不含有与数据库中表对应的id主键值时,该对象处于瞬时状态,当调用session对象的
get()
,
update()
,sava()
方法操作该实体类对象后,该对象会进入持久化状态,当事务提交后或者调用session对象的delete()
方法操作实体类对象后,该对象处于游离状态. -
持久化状态操作
当实体类对象处于持久化状态时,对该对象的变量进行set操作时,该操作会自动同步到数据库的表中.
-
实体类的编写规则
1.Bean对象相同
2.尽量使用包装类
3.不要使用final修饰该类
hibernate主键生成策略
-
简介
在hibernate中主键有两种类型,分别是代理主键与自然主键,代理之间就是没有业务逻辑的主键,例如我们对数据库表中某一条数据自动生成的uuid,它存在于表中,但它不没有任何用处,仅仅只是作为一个主键使用,而自然主键则是有自己的业务逻辑,例如人的身份证号,它是必须的,并且是唯一的,但在实际开发中很少遇到自然主键.
-
主键生成的配置
1.属于代理主键的配置
-
increment
用于整数类型的主键,由hibernate代理生成,每次加一,但有线程安全问题,禁止在实际开发中使用.
-
identity
由数据库底层实现,但数据库表中需要设置好主键自增设置.
-
Sequence
Orcle数据库专用的主键生成策略,也是由数据库底层实现.
-
native
根据数据库的类型不同,自动调用identity和sequence,还有一个hilo生成策略但因为这种策略遇不到,所以就不进行介绍了.
-
uuid
适用于字符串类型的主键,生成一个32位的16进制数.
2.自然主键
-
assigned
手动创建id主键.
-
hibernate 一级缓存和快照
-
一级缓存
简单理解就是当实体类进入持久化状态时,session会缓存该对象,例如当我们调用seesion的
get()
方法获得同一条数据生成一个实体类对象时,这由同一条数据生成的实体类是同一个,原理是当我们第一次调用get()
方法时,hibernate会进入数据库查询数据,并生成一个实体类对象返回给调用者,然后会把该对象添加到自己内部的缓存list集合中,当再次调用时,hibernate会优先从缓存中查找有没有要查询的数据,如果有,则直接返回缓存中保存的对象,没有的话才会进入数据库查询. -
快照
当在session的缓存中存入一个实体类时,hibernate还会备份该类到自己的快照区,当事务提交时,会清空session的缓存区,然后根据id主键来进行对比实体类与快照区域的实体类,如果两者中的数据不同时,才会调用数据库更新数据,否则不会调用数据库进行更新.例如:当我们使用
get()
方法获得一个实体类时,修改该类的某一些数据,最后再修改回来,事务提交时不会调用数据库更新数据.
hibernate支持的数据库查询语言
-
编写规则
请自行百度,因为我不是很喜欢.
-
Criteria
请自行百度,因为我不是很喜欢.
-
SQLQuery
-
简介
通过自己书写对应的数据库语言进行操作.
-
用法
String sql = "select * from tableName" //书写sql语句 Query query = session.createSQLQuery(sql); query.addEntity(实体类.class); //添加实体类的class文件,告知hibernate获取到的数据封装成什么类型 List<实体类名> list = query.list(); //将封装好的实体类放在一个list集合中,返回该集合 // 当知道该查询结果只有一条数据时可调用uniqueResult()方法 //Domain domain = query.uniqueResult();
-