博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hibernate框架(三)持久化类&主键生成策略
阅读量:7121 次
发布时间:2019-06-28

本文共 3077 字,大约阅读时间需要 10 分钟。

一 持久化类的一个编写规则

持久化:将内存中的一个对象持久化到数据库中的过程

持久化类:一个Java对象与数据库的表建立了映射关系,那么这个类在hibernate中称为持久化类
可以这么理解:持久化类=Java类+映射文件

持久化类的编写规则

1 对持久化类提供一个无参的构造方法
2 属性需要私有,对私有属性提供get和set方法
3 对持久化类提供一个唯一标识Oid与数据库中主键对应
4 持久化类中属性尽量使用包装类类型
5 持久化类不要使用final进行修饰


 

二 主键生成策略

先介绍一下主键的分类:自然主键和代理主键

自然主键:主键的本身就是表中的一个字段(试题中的一个具体的属性 身份证号)
代理主键:主键的本身不是表中必须的一个字段(不是实体中某个具体的属性)
在实际开发中,尽量使用代理主键
为什么不推荐使用自然主键,因为一旦自然主键参与到业务逻辑中,后期可能修改源代码
好的程序设计满足OCP原则:对程序的扩展是open的。对修改源代码是close的


 

主键生成策略(记住):

increment hibernate中提供的自动增长机制,单线程可以使用,多线程不可以
identity 使用的是数据库底层的自动增长机制(适用于MySQL SQL server,但是Oracle不适合)
sequence 采用的是序列的方式(适用于Oracle,MySQL就不适用)】
uuid 适用于字符串类型的主键
native 本地策略 ,可以在identity和sequence之间进行自动转换
assigned hibernate放弃外键的管理

结合不同的情况去使用

编程中遇到的问题
没有写自动生成语句的配置 ,导致hibernate不能为你创建表

update

三 持久化类的三种状态

hibernate是持久层框架,通过持久化类完成ORM操作。Hibernate为了更好的管理持久化类

将其分为三种:瞬时态、持久态、托管态
瞬时态:这种对象没有唯一的标识OID,没有被session管理
持久态:这种对象有唯一标识OID,被session管理
托管态:这种对象有唯一标识OID,没有被session管理
下面代码演示:这段程序包含了持久化的三种状态

public class TestDemo2 {    @Test    public void demo1(){        Session session = HibernateUtils.openSession();        Transaction beginTransaction = session.beginTransaction();                Customer customer=new Customer();            customer.setCust_name("王六");//瞬时态对象。没有唯一标识的OID,没有session管理                        Serializable id = session.save(customer);//持久态对象。有了唯一标识的OID,调用了session                beginTransaction.commit();        session.close();        System.out.println(customer.getCust_name());//托管态对象。有唯一标识的OID,session被销毁了    }}

 

我们重点研究的是持久态对象,
持久化类的持久态对象,可以自动更新数据库。

@Test    //持久态对象自动更新数据库    public void demo2(){        Session session = HibernateUtils.openSession();        Transaction beginTransaction = session.beginTransaction();        //获得持久态对象        Customer customer = session.get(Customer.class, 1l);        customer.setCust_name("小红");                beginTransaction.commit();        session.close();    }

我们可以看出并手动调用update方法,Hibernate就可以自动更新数据库了,持久态之所以有这样的功能主要依赖于他的一级缓存

四、Hibernate的一级缓存

什么是缓存:是一种优化的方式,将数据存放到内存中,使用的时候直接从缓存中去取

优化手段:缓存、抓取策略
一级缓存称为是session级别的缓存,生命周期和session一致。

五、Hibernate的事务控制

事务:指的是逻辑上的一组操作,组成这组操作的逻辑单元要么全部成功,要么全部失败
事务的四个特性:原子性、一致性、隔离性、持久性

  • Read Uncommitted(1级)
  • Read committed(2级)
  • Repeatable read(4级)
  • Serializable 序列化(8级)

实际开发中,不会选择最高或者最低隔离级别,选择Read committed(oracle默认),Repeatable read(mysql默认)。

 


 

Hibernate解决service的事务管理

1.在工具类中更改getCurrentSession方法

public static Session getCurrentSession(){        return sessionFactory.getCurrentSession();    }

2.在核心配置文件中进行如下配置

  
thread

六、Hibernate中其他的API

1.Query

     //条件查询        String hql="from Customer where cust_name like ?";        Query createQuery = session.createQuery(hql);        createQuery.setParameter(0, "王%");
     //分页查询        String hql="from Customer";        Query createQuery = session.createQuery(hql);        createQuery.setFirstResult(0);        createQuery.setMaxResults(2);

2.Criteria

//分页查询        Criteria criteria = session.createCriteria(Customer.class);        criteria.setFirstResult(3);        criteria.setMaxResults(2);

Criteria更加的面向对象。

 

转载于:https://www.cnblogs.com/bao6/p/10340122.html

你可能感兴趣的文章
营销人员为何要读《笑傲江湖》?
查看>>
敏捷开发“松结对编程”系列之十:L型代码结构(技术篇之一)
查看>>
C++与MySQL的冲突
查看>>
C# 文件操作类1
查看>>
[unity3d]鼠标拖动and旋转缩放
查看>>
VS2008 使用小技巧 提高编程效率
查看>>
安装Operations Manager代理程序
查看>>
详解Spring MVC 4之ViewResolver视图解析器
查看>>
解析和生成Excel报表方法汇总::.NET发现之旅(七)
查看>>
活动目录设计中需要遵循的七个原则
查看>>
【STM32 .Net MF开发板学习-04】TinyGUI位图显示
查看>>
NoSQL数据库简介
查看>>
Kevin Systrom和他的Instagram
查看>>
Oracle优化:千万级大表逻辑判断的累赘
查看>>
研讨会记录|与Xamarin工作簿研讨会探索UrhoSharp 3D
查看>>
Java事务处理类(源码)
查看>>
JAVA 设计模式 访问者模式
查看>>
SQL Server清空日志及所有表的数据
查看>>
浅谈ThreadPool 线程池
查看>>
J2EE实现XML文件的读取与导出(源码)
查看>>