持久层框架--hibernate(2)

一 .持久化对象的oid 映射为数据库表的主键,唯一不重复

当数据库表中的主键为代理主键时,持久化对象的oid 要交给hibernate来维护(避免重复)

当数据库中表的主键为自然主键时,持久化对象的oid 要由程序本身来维护

主键生成策略(生成持久化oid的方式):

1. increment 带走+1
由hibernate来维护oid的值,
优点:与底层数据库类型无关
缺点:只适用于单线程对数据库的访问

2. identity +1带走
优点:适合多用户访问
缺点:由于+1操作由数据库完成,所以数据库必须支持自增Mysql,sql server,db2

3. sequence
由数据库来维护oid的值
数据库要支持序列 Oracle,db2

4. native
根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。
持久化对象的oid类型必须为 long,short 或者 int 类型的,不能使用byte

5. uuid
数据库表中数据量非常大,但不会经常进行查询操作,就可以使用字符串作为表单主键。

6. assigned 手动分配id
适用于自然主键
比如:loginName作为主键

三. 定义持久化对象属性时,如果属性为基本数据类型,最好使用对应的包装类型

int score;//0
Integer score;//null

四. 快照
session的一级缓存 存在快照区域
只有在查询操作时,会产生快照区域
快照区域保存查询对象的原始状态
当session执行flush方法时,会用缓存中的对象和快照中的原始数据进行比较
如果两组数据不同,则自动发送update来更新数据库

数据库中,自己手动创建序列

对应Customer.hbm.xml做的修改:

       <generator class="native">
              <param name="sequence">cus_id_seq</param>        </generator>
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping>
 6     <class name="com.edu.oid.Customer" table="tab_customer">
 7         <id name="id" column="id" type="integer">
 8             <!-- 主键生成策略
 9             <generator class="native">
10                 <param name="sequence">cus_id_seq</param>
11             </generator>
12             -->
13             <generator class="assigned"/>
14         </id>
15
16         <!-- 配置普通属性 -->
17         <property name="name" column="name" type="string"/>
18         <property name="age" column="age" type="integer"/>
19         <property name="des"/>
20     </class>
21
22 </hibernate-mapping>

序列跟主键号才能一一对应

二 .持久化对象生命周期的4种状态:

    1. 临时状态(瞬时状态)
    2. 持久化状态
    3. 游离状态
    4. 删除状态

session对象一级缓存 线程级别的缓存 内置的必须使用
sessionFactory对象 二级缓存 进程级别的缓存 可配置(插拔)

  1 package com.edu.cache;
  2
  3 import org.hibernate.SessionFactory;
  4 import org.hibernate.Transaction;
  5 import org.hibernate.cfg.Configuration;
  6 import org.hibernate.classic.Session;
  7 import org.junit.Test;
  8
  9 /**
 10  * 使用单元测试工具,测试hibernate 的增删改查(CRUD)操作
 11  *
 12  * @author Administrator
 13  *
 14  */
 15 public class TestHibernate {
 16
 17     private static SessionFactory sf;
 18     static {
 19         // 1. 加载配置文件
 20         Configuration cfg = new Configuration();
 21         cfg.configure("com/edu/cache/hibernate.cfg.xml");
 22
 23         // 2. 获得SessionFactory
 24         sf = cfg.buildSessionFactory();
 25     }
 26
 27
 28     @Test
 29     public void find() {
 30
 31
 32         Session session = sf.openSession();
 33         Transaction tran = session.beginTransaction();
 34
 35         Customer c1 = (Customer) session.get(Customer.class, 1);//发生sql
 36         Customer c3 = (Customer) session.get(Customer.class, 2);//发生sql
 37         Customer c2 = (Customer) session.get(Customer.class, 1);//不发生sql
 38
 39         tran.commit();
 40         session.close();
 41     }
 42
 43     @Test
 44     public void flush() {
 45
 46
 47         Session session = sf.openSession();
 48         Transaction tran = session.beginTransaction();
 49
 50         //临时状态    新建对象   不被session缓存管理,oid的值为null
 51         Customer c = new Customer();
 52         c.setName("张三");
 53
 54         /*
 55          *  纳入到session缓存管理,并为其分配了oid的值,由临时状态转变为持久化状态
 56          *  数据库中没有与之关联的记录
 57          */
 58         session.save(c);//不发送insert
 59
 60         //刷新缓存,被生产sql语句发送给数据库,并准备执行
 61         session.flush();//发送
 62
 63         /*
 64          * 执行sql语句,影响数据库中的记录
 65          * 如果程序中没有手动调用flush方法,
 66          * commit提交事务前,会自动调用flush.
 67          */
 68         tran.commit();
 69         //session关闭,缓存释放,由持久化状态转换为游离状态。处于游离状态的对象生命周期并没有结束
 70         session.close();
 71         System.out.println(c.getName());
 72         c = null;//对象c的生命周期结束
 73     }
 74
 75     //清空缓存
 76     @Test
 77     public void clear() {
 78
 79
 80         Session session = sf.openSession();
 81         Transaction tran = session.beginTransaction();
 82
 83         Customer c1 = (Customer) session.get(Customer.class, 1);//发生sql
 84         session.clear();
 85         Customer c2 = (Customer) session.get(Customer.class, 1);//发生sql
 86
 87         tran.commit();
 88         session.close();
 89     }
 90     //清除
 91     @Test
 92     public void evict() {
 93
 94
 95         Session session = sf.openSession();
 96         Transaction tran = session.beginTransaction();
 97
 98         Customer c1 = (Customer) session.get(Customer.class, 1);//发生sql
 99         Customer c2 = (Customer) session.get(Customer.class, 2);//发生sql
100         session.evict(c1);
101
102         Customer c3 = (Customer) session.get(Customer.class, 1);//发生sql
103         //Customer c4 = (Customer) session.get(Customer.class, 2);//不发生sql
104         session.update(c1);//c1从游离状态转为持久化状态
105
106         tran.commit();
107         session.close();
108     }
109
110     //批量插入50万条记录
111     /*@Test
112     public void batchSave() {
113
114
115         Session session = sf.openSession();
116         Transaction tran = session.beginTransaction();
117
118         for(int i=0;i<500001;i++) {
119             Customer c = new Customer();
120             c.setName("tom"+i);
121             session.save(c);
122
123             if(i%10000==0) {
124                 session.flush();//向数据库发送了10000条insert语句
125                 session.clear();//清空缓存
126             }
127         }
128
129         tran.commit();
130         session.close();
131     }*/
132
133     //快照
134     @Test
135     public void kuaiZhao() {
136
137
138         Session session = sf.openSession();
139         Transaction tran = session.beginTransaction();
140
141         Customer c = (Customer) session.get(Customer.class, 1);
142         c.setName("tom");
143         System.out.println(c.getId());
144
145
146         //更新前查询,避免由此操作改名了持久化对象的状态,二影响数据库中的记录。
147     //    session.refresh(c);
148     //    session.update(c);
149
150         tran.commit();
151         session.close();
152     }
153
154 }
时间: 2024-12-18 02:28:04

持久层框架--hibernate(2)的相关文章

持久层框架hibernate相关概念

hibernate为全自动的持久层框架(framework): 1.作用:把内存中的活跃对象永远的保存在关系型数据库中. 2.O/R/M原理:O-->object 对象,R---> relational关系型数据库,M--->mapping映射 为了解决应用程序中的对象和关系型数据库中的表的不匹配而提出的一个解决方案. 3.新版本hibernate4中怎么得到session工厂从而创建连接对象 Configuration cfg = new Configuration().configu

持久层框架--hibernate(3)

一:关联关系 1.关联关系的方向可分为单向关联和双向关联 单向关联:假设存在两张表province表和City表,如果在应用的业务逻辑中,仅需要每个province实例能够查询得到其对应的City实例,而City实例并不需要查询得到其对应的province实例:或者反之. 双向关联:既需要每个province实例能够查询得到其对应的City实例,City实例也需要查询得到其对应的province实例. 2.关联的数量,根据拥有被关联对象的个数确定 多对一(many to one):如用户和组 学

持久层框架--hibernate(4)

一.多对多双向关联 以Student和Course为例,一个学生可以选多门课程,一门课程也可以被多个学生选取 持久化类Student 1 持久化类Student.java 2 3 package com.edu.many2many; 4 5 import java.util.HashSet; 6 import java.util.Set; 7 8 public class Student { 9 10 private Integer id; 11 private String name; 12

Hibernate数据库持久层框架

Hibernate是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hibernate也是目前Java开发中最为流行的数据库持久层框架,现已归JBOSS所有. 它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来.无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用Hibernate. Hibernate不仅负责从Java类到数据库表的映射(还

[笔面] Hibernate等持久层框架应用面试

Hibernate等持久层框架应用 1.Hibernate框架的工作流程a. 读取并解析配置文件b.读取并解析映射信息,创建SessionFactoryc.打开Sesssiond.创建事务Transatione.持久化操作f.提交事务g.关闭Sessionh.关闭SesstionFactory 2.Hibernate框架中的核心接口有哪些,这些接口的具体功能是什么?核心接口有:session,sessionFactory,transaction,query,configuration.a) Se

Hibernate: 数据持久层框架

Hibernate 是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hibernate也是目前Java开发中最为流行的数据库持久层框架,现已归JBOSS所有.基于LGPL V2.1协议发布. 它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来.无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用Hibernate. Hibernate不仅负

MyBatis持久层框架使用总结

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2013年11月迁移到Github,MyBatis的Github地址:https://github.com/mybatis/mybatis-3. iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Dat

JPA规范及其它持久层框架

JPA规范及其它持久层框架 JPA是一种规范,而hibernate是JPA的一种实现 JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口.JPA吸取了目前Java持久化技术的优点,旨在规范.简化Java对象的持久化工作.使用JPA持久化对象,并不是依赖于某一个ORM框架. JPA是目前比较流行的一种ORM技术之一,所以他拥有ORM技术的各种特点,当然他还有自己的一些优势: 1 标准化 JPA 是 JCP 组织

MyBatis持久层框架使用总结 转载

MyBatis持久层框架使用总结 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2013年11月迁移到Github,MyBatis的Github地址:https://github.com/mybatis/mybatis-3. iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架.iBATIS提供的持久