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(表名) where username(字段)="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(二)持久化对象的状态
简介 以前学习Hibernate的笔记,整理一下便发出来了,防止弄丢.有错误的话麻烦各位留言评论,感激不尽. 持久化类 Hibernate完成了从面向对象模型表示的对象至关系模型表示的数据结构的映射, ...
- (十二)Hibernate中的多表操作(2):单向多对一
由“多”方可知“一”方的信息,比如多个员工使用同一栋公寓,员工可以知道公寓的信息,而公寓无法知道员工的信息. 案例一:使用xml配置 pojo类 Group.java package bean; // ...
- Hibernate三种状态;query查询;ResultTransformer转换为pojo对象;能够将query语句写在xml中;Criteria查询;ProjectionList总和/f分组等函数
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010026901/article/details/24256091 Session操作过程中的po ...
- Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...
- 【Hibernate框架】对象的三种持久化状态
一.综述 hibernate中的对象有三种状态,分别是TransientObjects(瞬时对象).PersistentObjects(持久化对象)和DetachedObjects(托管对象也叫做离线 ...
- 【hibernate 报错】No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer 【get和load的区别】
报错: HTTP Status 500 - Could not write content: No serializer found for class org.hibernate.proxy.poj ...
- Hibernate之Session对象的相关方法以及持久化对象的状态
一.持久化对象的状态 站在持久化的角度, Hibernate 把对象分为 4种状态: 持久化状态,临时状态,游离状态,删除状态.Session 的特定方法能使对象从一个状态转换到另一个状 ...
- Hibernate(四)之对象状态及一级缓存
一.Hibernate中的对象状态 1.1.瞬时态(临时态) 没有与Hibernate产生关联 与数据库中的记录没有产生关联(有关联就是与数据库中表的id相对应) 获得:一般都只直接创建(new) 瞬 ...
随机推荐
- Linux查看系统状态及备份
1. 如何看当前Linux系统有几颗物理CPU和每颗CPU的核数?cat /proc/cpuinfo将CPU的总核数除以物理CPU的个数,得到每颗CPU的核数.2. 查看系统负载有两个常用的命令,是哪 ...
- python-文件压缩和解压
import tarfile #压缩 tar = tarfile.open('your.tar','w') tar.add('ooo.xml',arcname='ooo.xml') tar.close ...
- SQL中@@ROWCOUNT函数
返回受上一语句影响的行数.如果行数大于 20 亿,请使用 ROWCOUNT_BIG. 语法 @@ROWCOUNT 返回类型 int 注释 Transact-SQL 语句可以通过下列方 ...
- 提高jQuery执行效率
1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能. 下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的j ...
- Java数据结构漫谈-Vector
List除了ArrayList和LinkedList之外,还有一个最常用的就是Vector. Vector在中文的翻译是矢量,向量,所以大家喜欢把Vector叫做矢量数组,或者向量数组. 其实就底层实 ...
- Oracle游标cursor2显示的游标等
--在一中我们介绍了实现过程 select *from stud; declare cursor mycur is select id,name from stud;--1声明 v_id intege ...
- IOS 请求服务器的方式
IOS 中请求服务器的方式主要有Get 和Post . Get :[1]向服务器发索取数据的一种请求; [2]获取信息,而不是修改信息,类似数据库查询功能一样,数据不会被修改;请求的参数会跟在url后 ...
- c++模板编程-异质链表
概念: 像一个普通的链表结点中,其中成员next通常是指向同类型结点的指针.这就约束了链表中结点必须是同一类型,从而整个链表都只能保存同一类型的数据.而异质链表则是让next指向任何一种类型,也包括存 ...
- EL表达式复习
EL表达式格式: 格式1:${objName.attribute} 执行的过程为:从pageContext.request.session.application中依次查找绑定名为“user”的对象, ...
- Unsupported major.minor version 52.0 处理方式
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/globalroam/openstac ...