博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate持久化对象的状态
阅读量:6002 次
发布时间:2019-06-20

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

1. 
站在持久化的角度 
, 
Hibernate 
把对象分为 
4 
种状态 
: 
持久化状态
, 
暂时状态
, 
游离状态(脱管状态) 
, 
删除状态
.
Session 
的特定方法能使对象从一个状态转换到还有一个状态 
.
2. 
暂时状态(
Transient
 
:
    
1
. 
在使用代理主键的情况下 
, 
OID 
通常为 
null
    
2
. 
不处于 
Session 
的缓存中
    
3
. 
在数据库中没有相应的记录
3. 
持久化状态
(
也叫”托管” 
)
 
Persist
    
1
. OID 
不为 
null
    
2
. 
位于 
Session 
缓存中
    
3
. 
若在数据库中已经有和其相应的记录 
, 
持久化对象和数据库中的相关记录相应
    
4
. Session 
 
flush 
缓存时 
, 
会依据持久化对象的属性变化 
, 
来同步更新数据库
    
5
. 
在同一个 
Session 
实例的缓存中 
, 
数据库表中的每条记录仅仅相应唯一的持久化对象( 
Session 
缓存对象的 
OID 
不能反复)
    @Test
    public void testOID
(){
        News news2 
= 
(
News 
) 
session.get 
(
News.class 
, 
1
);
        System.out.println 
(
news2 
);
    
        News news 
= 
new News 
();
        news.setAuthor 
(
"Oracle2" 
);
        news.setContent 
(
"Oracle DB" 
);
        news.setDate 
(
new Date 
());
        news.setTitle 
(
"DB" 
);
        news.setId 
(
1 
);
    
         
//
抛出异常: 
org.hibernate.NonUniqueObjectException
        session.update 
(
news 
);
    
}
4. 
游离状态
(
也叫”脱管” 
) 
Detached 
):
    
1
. OID 
不为 
null
    
2
. 
不再处于 
Session 
缓存中
    
3
. 
普通情况需下 
, 
游离对象是由持久化对象转变过来的 
, 
因此在数据库中可能还存在与它相应的记录
5. 
删除状态
(
Removed
)
    
1
. 
在数据库中没有和其 
OID 
相应的记录
    
2
. 
不再处于 
Session 
缓存中
    
3
. 
普通情况下 
, 
应用程序不该再使用被删除的对象
6. 
状态的转换图
7. 
get & load 
的差别:
    
共同点:
    get
load 
从数据表中载入一个对象 
, 
载入后即为持久化状态的对象
    
不同点:
    get
: 
马上查询数据表
. 
若没有相应的记录 
, 
返回 
null 
    
load
: 
延迟查询数据表 
. 
直到第一次使用该对象时 
, 
再进行查询,
    
先返回的是一个代理对象 
. 
若没有相应的记录 
,
而且使用了该对象 
, 
则会抛出
org.hibernate.ObjectNotFoundException 
异常
8. 
update 
方法:
    @Test
    public void testUpdate
(){
        News news 
= 
(
News 
) 
session.get 
(
News.class 
, 
1
);
        System.out.println 
(
news 
);
    
        transaction.commit 
();
        session.clear 
();
    
        session 
= 
sessionFactory.openSession 
();
        transaction 
= 
session.beginTransaction 
();
    
         
//
此时对象为游离状态
        news.setAuthor 
(
"Oracle" 
);
    
         
//
update 
能够使游离对象变为持久化对象 
.
         
//
通常须要发送一条 
UPDATE 
语句
         
//
若对象即为持久化对象 
, 
则不须要调用 
update
() 
方法
        session.update 
(
news 
);
    
}
注意:
1
 
. 
使用场景: 
B\S 
项目中从页面传过来一个对象,须要对其进行更新时,即调用 
update
()方法
2
 
. 
若数据表中没有对象相应的记录,还要运行 
update
() 
方法,则会抛出异常: 
org.hibernate.StaleObjectStateException
9. 
saveOrUpdate 
(): 
保存或更新
11. 
delete 
()
:删除一个对象相应的记录。
    
1
. 
若仅仅想删除指定的对象,设置 
ID 
就可以。

    
2
. 
若数据表中没有相应的记录。则抛出异常: 
java.lang.IllegalArgumentException
12. 
Hibernate 
调用原生的 
JDBC API
    session.doWork
(
new Work
() 
{
        @Override
        public void 
execute
(
Connection connection 
) 
throws SQLException 
{
             
//
使用 
JDBC 
原生的 
API
         
}
    
});
你可能感兴趣的文章
rsync之中文编码同步失败的问题
查看>>
HADOOP HDFS 测试结果
查看>>
PAM详细介绍
查看>>
我的友情链接
查看>>
意象图式
查看>>
Ubuntu下ns2.35的安装设置
查看>>
python实现基于ssh的分发器
查看>>
Linux网卡名改eth0方法
查看>>
SQL or NoSQL——云计算环境中该选择谁
查看>>
托盘气泡很长时间才能消失,uTimeout没起到作用的解决办法
查看>>
利用webshell搭建socks代理
查看>>
nginx+keepalived构建主主负载均衡代理服务器
查看>>
10 分钟简读经典著作 Data Warehouse Toolkit
查看>>
骨骨Linux学习笔记
查看>>
java:当try、finally遇到return和exit
查看>>
我的友情链接
查看>>
NSQ:分布式的实时消息平台
查看>>
DIY强大的虚拟化环境-组装于测试部分1.2存储主机之机箱与主板
查看>>
Active Directory 活动目录(简称AD)的基础架构与使用(二)
查看>>
老调重弹:年龄大了,码农何去何从 (长篇技术文学巨著)
查看>>