初学hibernate笔记

来源:互联网 发布:ubuntu查看内核版本 编辑:程序博客网 时间:2024/06/05 08:01

 1.hibernate的三种对象状态
transient:顺势状态
persistent:持久化状态
detached:脱管状态
瞬时状态:内存中的对象在数据库中没有与之对应的记录,并且

此对象没有纳入session的管理,那么此时的对象的任何变化都不

会发出sql语句,也就是说o和r没有联动。
(判断对象和数据库是否关联的重要标准就是判断对象是否具有

持久化标识)
持久化状态:内存中的对象在数据库中有与之对应的记录,并且

对象纳入session管理,此时o的任何变化都会自动的发出sql语句

,也就是说对像和数据库是实时联动;
脱管状态:内存中的对象在数据库中有与之对应的记录,但是对

象没有纳入session管理,那么此时o的任何变化都不会发出sql语

句,也就是说o和r没有联动
2.对对象设置了持久化标识,此时由于此标识在数据库中已经存

在,则user变为脱管状态
user.setId(1);
3.由于这个数据库设置主键自动递增,所以不能setId()使他save

一个没建立的记录
4.在get()方法执行时,首先搜索缓存中是否存在持久化标识为这

个的对象,如果存在则直接从缓存中获此对象,否则立即发送sql

语句进行查询
5.session.delete(user)之后,数据库中没有此记录,所以变为

瞬时对象
6.瞬时状态变为持久化状态方法:save(),load(),get()
脱管状态变为持久化方法:update(),load(),get()
7,不能有两个相同持久化标识对象存在,因为主键冲突
//脱管状态
user1.setId(10);
user1.setUsername("shazi");
//脱管状态
user2.setId(10);
user2.setUsername("baichi");
session.update(user1);//脱管状态变为持久化状态,
session.update(user2);//造成主键冲突
然而最后两条语句可以变为:
session.merge(user1);//不会改变状态,不会从脱管状态变为持

久化状态
session.merge(user2);
8.session-factory用于给客户提供数据库连接
9.hibernate-mapping中package (可选): 指定一个包前缀,如果

在映射文档中没有指定全限定的类名, 就使用这个作为包名