Hibernate框架(二)POJO对象的操作
POJO对象其实就是我们的实体,这篇博客总结一下框架对POJO对象对应数据库主键的生成策略,和一些对POJO对象的简单增删改查的操作。
一,Hibernate框架中主键的生成策略有三种方式:
1,数据库负责生成主键(代理主键)
a,native:表示由设置的方言决定采用什么数据库生成主键方式,例如:在MySQL中会采用自增长的方式,主键字段必须都是整形类型;在Oracle数据库中,会采用序列的增长方式。
b,sequence:表示采用数据库的序列生成主键,适用于Oracle,DB2数据库中。
c,identity:表示采用自增长的主键生成方式,适用于MySQL,SQL Server中。
2,Hibernate框架负责生成主键值(代理主键):
a,increment:表示由框架本身提供计数器,累加数据,获取主键。
b,uuid:由框架根据参数(IP地址,JVM虚拟机启动时间,系统时间,计数器等)生成32位16进制的数字字符串。
3,用户提供主键值(自然主键):
Assigned:业务(自己)提供主键。
当然这里常用的是native,uuid和Assigned三值。在设置POJO类与表映射时,进行主键设置,标签为<id>,在其中的<generator>标签中进行设置,例如:
- <!--
- id标签用来映射主键字段
- name属性表示类的属性
- column属性表示表的字段
- -->
- <id name="usercode" column="usercode" length="32" type="java.lang.String">
- <!-- 主键生成策略 -->
- <generator class="assigned"/>
- </id>
二,Hibernate框架下的POJO对象的三种状态:
1,瞬时状态(临时状态):Transient Object
对象和数据库的数据没有关联,并且没有和框架关联在一起。例如,我们刚刚 new User();
2,持久化状态:Persistent Object
对象和数据库的数据存在关联,并且和框架关联在一起。例如我们刚刚进行保存的session.sava(user);
3,游离状态(离线状态,托管状态)Detached Object
对象和数据库的数据存在关联,但是和框架没有关联。例如保存后session关闭的user。
看一下三种状态POJO对象的转换吧:
三,Hibernate,对三种状态下的POJO的增删改查操作:
|
瞬时状态 |
持久化状态 |
游离状态 |
|
|
增(Save) |
可以 |
不可以(没必要) |
不可以(没必要) |
|
改(Update) |
不可以 |
修改后会自动更新,不需手动 |
可以 |
|
删(delete) |
不可以 |
可以 |
可以 |
|
查 |
不可以 |
可以 |
可以 |
1,保存(Save):
通过session.save(user);就可以保存数据了,但是这里想提一下,主键的生成策略不同,框架发送sql语句的时间是不同的:
a,native:在调用save方法时发送insert语句。
b,uuid主键生成策略和assigned主键生成策略:在提交事务时发送insert语句。
这是因为主键的生成时机不同,由于native是在数据库中生成的,所以发送的比较早。
2,更新(Update):
这里想说一下对游离对象的更新:
|
uuid |
assigned |
native |
|
|
存在记录 |
发送upate语句 |
会查询判断,再更新 |
发送update语句 |
|
记录不存在 |
发送语句,剖异常 |
会查询判断,进行插入操作 |
发送语句,剖异常 |
3,删除(delete):
这里只要提供主键,可以根据主键id删除,只要id存在即可。
4,查询:
a,主键查询:
get:返回结果可能是:持久化对象或null,所以需要对结果进行非空判断。它利用了缓存,是立即查询。
//get方法查询如果成功,那么返回的对象状态是持久化状态
Objectobj = session.get(User.class, "admin");
load:返回结果可能是:持久化对象或cglib代理对象或异常,利用缓存,默认为延迟加载。
//load方法第一查询结果存放到缓存中,支持延迟加载,效率更高,但是主要
Objectobj = session.load(User.class, "admin");
b,普通查询(面向对象查询):后边会介绍
1,Query:HQL
(HibernateQuery Language),HQL语言是对SQL语言的封装,是面向对象的查询语言。例如:SQL
: select * from t_user(表名) whereusername(字段)="tom"
HQL : from User(类名) where username(属性)="tom"
- //分页查询
- String hql = "from User u "; //面向对象查询 HQL!!!!!
- Query query = session.createQuery(hql);
- int pageno = 3 ;
- int pagesize = 2 ;
- int index = (pageno - 1) * pagesize ;
- query.setFirstResult(index);//某页的第一个下标
- query.setMaxResults(pagesize); //页数的大小
- //条件查询
- String hql = "from User u where u.usercode=? and u.userpswd=?"; //面向对象查询 HQL!!!!!
- Query query = session.createQuery(hql);
- query.setString(0, "admin"); //索引从0开始
- query.setString(1, "admin");
2, Criteria:将所有的操作都以面向对象的方式进行完成。
- //分页查询
- Criteria cra = session.createCriteria(User.class);
- cra.setFirstResult(0); //开始索引
- cra.setMaxResults(2); //每页数量
- //排序
- Criteria cra = session.createCriteria(User.class);
- cra.addOrder(Order.desc("username"));
- //条件查询
- Criteria cra = session.createCriteria(User.class);
- cra.add(Restrictions.eq("username", "aaa"));
- cra.add(Restrictions.eq("usercode", "aaa"));
综上为Hibernate对POJO对象的简单操作,主要是做好映射,简单的配置,然后利用Hibernate里边的方法进行配置。这里这是举了几个简单的例子涉及的知识较少,我们可以查看Hibernate的帮助文档中进行查看参考,会帮助我们很多的
Hibernate框架(二)POJO对象的操作的更多相关文章
- Hibernate(二)——POJO对象的操作
POJO对象其实就是我们的实体,这篇博客总结一下框架对POJO对象对应数据库主键的生成策略,和一些对POJO对象的简单增删改查的操作. 一,Hibernate框架中主键的生成策略有三种方式: 1,数 ...
- (转)Hibernate框架基础——Java对象持久化概述
http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构 说明 ...
- hibernate框架学习之对象状态
lHibernate对象共有三种状态 •瞬时状态:瞬时对象 •持久化状态:持久化对象 •托管状态:托管对象 l瞬时对象(Transient Object),简称TO l瞬时对象指的是应用程序创建出来的 ...
- hibernate框架的核心对象和相关知识点
Hibernate架构下图提供了hibernate体系的高层视图: Hibernate全面解决方案: Hibernate核心APIConfiguration负责管理数据库的配置信息.数据库的配置信息包 ...
- selenium3 web自动化测试框架 二:页面基础操作、元素定位方法封装、页面操作方法封装
学习目的: 掌握自动化框架中需要的一些基础web操作 正式步骤: 使用title_contains检查页面是否正确 # -*- coding:utf-8 -*- import time from se ...
- hibernate框架(3)---持久化对象
持久化对象 再讲持久化对象之前,我们先来理解有关session中get方法与 load方法区别: 简单总结: (1)如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库 ...
- 使用Hibernate框架来更新对象的注意事项
Hibernate在更新对象的时候,如果对象的有些属性没有设置,那么在更新的时候,会被默认为空. 特别在更新表单对象的时候. 例子: 如: Department部门类 该部门类有以下属性: id : ...
- Hibernate框架(一)总结介绍
作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编写重复的 ...
- Hibernate框架入门
导读 本文主要介绍hibernate的入门,主要包括以下内容:hibernate介绍.hibernate环境搭建.hibernate简单测试.测试涉及的api详解. 一.hibernate介绍 JDB ...
随机推荐
- Docker无法正常启动的原因及解决办法
一.Docker启动异常表现: 1.状态反复restaring,用命令查看 $docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS ...
- SpringBoot + WebSocket 实现答题对战匹配机制
概要设计 类似竞技问答游戏:用户随机匹配一名对手,双方同时开始答题,直到双方都完成答题,对局结束.基本的逻辑就是这样,如果有其他需求,可以在其基础上进行扩展 明确了这一点,下面介绍开发思路.为每个用户 ...
- MySQL 通过.frm文件和.ibd文件实现InnoDB引擎的数据恢复
起因是这样的,公司的领导表示说服务器崩了,修理好之后,只剩下数据库目录下的物理文件(即.frm文件与.ibd文件).然后,整了一份压缩包给我,叫我瞅一下能不能把数据恢复出来.我当场愣了一下,这都啥文件 ...
- Jenkins+gitlab发布Django程序
Jenkins+gitlab发布Django程序 一. 二. 三.shell # !/bin/bash cd /root/upload_file #git add . #git commit -m ' ...
- NVIDIA 认证系统
NVIDIA 认证系统 AI 是这个时代最强大的技术,需要新一代经过调整和测试的计算机来推动其发展. 自 1 月 27 日开始,可从 NVIDIA 合作伙伴处获取用于数据中心的新型加速服务器,推动 A ...
- 解决:ImportError: DLL load failed while importing _sqlite3: 找不到指定的模块。
Django框架学习第一步,创建一个Django工程. 本次采用的是创建虚拟环境来创建Django工程.本地解释器采用anaconda ,内置Python3.8 在pycharm中报错: 内容如下:I ...
- ES6中的变量结构赋值
小编的上一篇文章更新了es6中关于变量定义的问题,这篇文章继续来一些实用的干货,关于数组.对象的赋值问题.特别是在前后端合作项目的时候,对后端数据的拆分,还有就是对于函数的默认值的惰性赋值问题.看完下 ...
- springboot——重定向解决刷新浏览器造成表单重复提交的问题(超详细)
原因:造成表单重复提交的原因是当我们刷新浏览器的时候,浏览器会发送上一次提交的请求.由于上一次提交的请求方式为post,刷新浏览器就会重新发送这个post请求,造成表单重复提交. 解决办法: 将请求当 ...
- 【python学习小知识】求绝对值和numpy和tensor的相互转换
一.python求绝对值的三种方法 1.条件判断 2.内置函数abs() 3.内置模块 math.fabs 1.条件判段,判断大于0还是小于0,小于0则输出相反数即可 # 法1:使用条件判断求绝对值 ...
- 权限管理(基本权限、附加权限、ACL权限)
基本权限 •访问方式(权限) 读取:允许查看内容-read r 写入:允许修改内容-write w 可执行:允许运行和切换-execute x 对于文本文件 r: cat head ...
