Hibernate持久化对象的状态
时间:2021-07-01 10:21:17
帮助过:24人阅读
1. 站在持久化的角度 , Hibernate 把对象分为 4 种状态 : 持久化状态 , 临时状态 , 游离状态(脱管状态) , 删除状态.Session 的特定方法能使对象从一个状态转换到另一个状态 . 2. 临时状态(Transient) : 1). 在使用代理主键的情况下 , OID 通常为 null 2
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
:<喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPiDBory0sunRr8r9vt2x7S4gyPTDu9PQttTTprXEvMfCvCA8c3Ryb25nPiw8L3N0cm9uZz4gt7W72CBudWxsIKO7CgogICAgPHN0cm9uZz5sb2FkPC9zdHJvbmc+PHN0cm9uZz46PC9zdHJvbmc+INHTs9my6dGvyv2+3bHtIC4g1rG1vbXa0ru0zsq508O4w7bUz/PKsSA8c3Ryb25nPiw8L3N0cm9uZz4g1Nm9+NDQsunRr6OsCgogICAgz8i3tbvYtcTKx9K7uPa0+sDtttTP8yAuIMj0w7vT0LbU06a1xLzHwrwgPHN0cm9uZz4sPC9zdHJvbmc+sqLH0sq508PBy7jDttTP8yA8c3Ryb25nPiw8L3N0cm9uZz4g1PK74cXXs/ZvcmcuaGliZXJuYXRlLk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uINLss6MKCjxicj4KCgo8YnI+CgoKOC4gdXBkYXRlILe9t6ijugoKPGJyPgoKCiAgICBAVGVzdAoKICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGU8c3Ryb25nPigpezwvc3Ryb25nPgoKICAgICAgICBOZXdzIG5ld3MgPHN0cm9uZz49PC9zdHJvbmc+IDxzdHJvbmc+KDwvc3Ryb25nPk5ld3MgPHN0cm9uZz4pPC9zdHJvbmc+IHNlc3Npb24uZ2V0IDxzdHJvbmc+KDwvc3Ryb25nPk5ld3MuY2xhc3MgPHN0cm9uZz4sPC9zdHJvbmc+IDE8c3Ryb25nPik7PC9zdHJvbmc+CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiA8c3Ryb25nPig8L3N0cm9uZz5uZXdzIDxzdHJvbmc+KTs8L3N0cm9uZz4KCiAgICAKCiAgICAgICAgdHJhbnNhY3Rpb24uY29tbWl0IDxzdHJvbmc+KCk7PC9zdHJvbmc+CgogICAgICAgIHNlc3Npb24uY2xlYXIgPHN0cm9uZz4oKTs8L3N0cm9uZz4KCiAgICAKCiAgICAgICAgc2Vzc2lvbiA8c3Ryb25nPj08L3N0cm9uZz4gc2Vzc2lvbkZhY3Rvcnkub3BlblNlc3Npb24gPHN0cm9uZz4oKTs8L3N0cm9uZz4KCiAgICAgICAgdHJhbnNhY3Rpb24gPHN0cm9uZz49PC9zdHJvbmc+IHNlc3Npb24uYmVnaW5UcmFuc2FjdGlvbiA8c3Ryb25nPigpOzwvc3Ryb25nPgoKICAgIAoKICAgICAgICAgPHN0cm9uZz4vLzwvc3Ryb25nPrTLyrG21M/zzqrTzsDr17TMrAoKICAgICAgICBuZXdzLnNldEF1dGhvciA8c3Ryb25nPig8L3N0cm9uZz4mcXVvdDtPcmFjbGUmcXVvdDsgPHN0cm9uZz4pOzwvc3Ryb25nPgoKICAgIAoKICAgICAgICAgPHN0cm9uZz4vLzwvc3Ryb25nPnVwZGF0ZSC/ydLUyrnTzsDrttTP87Hkzqqz1r7Du6+21M/zIC4KCiAgICAgICAgIDxzdHJvbmc+Ly88L3N0cm9uZz7NqLOj0OjSqreiy83Su8z1IFVQREFURSDT777kCgogICAgICAgICA8c3Ryb25nPi8vPC9zdHJvbmc+yPS21M/zvLTOqrPWvsO7r7bUz/MgPHN0cm9uZz4sPC9zdHJvbmc+INTysrvQ6NKqtffTwyB1cGRhdGU8c3Ryb25nPigpPC9zdHJvbmc+ILe9t6gKCiAgICAgICAgc2Vzc2lvbi51cGRhdGUgPHN0cm9uZz4oPC9zdHJvbmc+bmV3cyA8c3Ryb25nPik7PC9zdHJvbmc+CgogICAgPHN0cm9uZz59PC9zdHJvbmc+Cgo8YnI+CgoK16LS4qO6Cgoxo6kgLiDKudPDs6G+sKO6IEJcUyDP7sS/1tC009Kzw+a0q7n9wLTSu7j2ttTP86Os0OjSqrbUxuS9+NDQuPzQwsqxo6y8tLX308MgdXBkYXRlo6ijqbe9t6gKCjKjqSAuIMj0yv2+3bHt1tDDu9PQttTP87bU06a1xLzHwryjrLu50qrWtNDQIHVwZGF0ZTxzdHJvbmc+KCk8L3N0cm9uZz4gt723qKOs1PK74cXXs/bS7LOjo7ogb3JnLmhpYmVybmF0ZS5TdGFsZU9iamVjdFN0YXRlRXhjZXB0aW9uCgo8YnI+CgoKOS4gc2F2ZU9yVXBkYXRlIDxzdHJvbmc+KCk6PC9zdHJvbmc+ILGjtOa78rj80MIKCjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/2014/1107/20141107092134167.png" alt="\">
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
}
});