028_CoreAPI_对象三种状态
?
星期一, 一月 04, 2016 ?15:07
?
上节课问题:
? ? ? ?opensession 和getcurrentsession这两种分式不能混用。
? ? ? ?两种session拿到的不是同一个。
? ? ? ?session是一个接口,拿到的具体的实现类不是一个。
?
?
session接口
查下hibernate ?api文档
?
在哪里
不在distribution?
?
hibernate官网上找,hibernate api
扒网站
http://blog.sina.com.cn/s/blog_673be8c40100rum3.html
hibernate 3.2api ?自己下载
?
文档里
org.hibernate.session
被JBOSS收购(卖文档)被red hat收购
?
?
在学习jdbc的时候要写 ?try catch finally
?
存在概念:
1.只用hibernate时,要写try catch finally
2.hibernate在和spring一起使用的时候,不用写try catch finally
讲到spring的时候再说。
?
看一些接口:
org.hibernate.session
hibernate的几种状态
?
1.public Serializable save(Object object)
? ? ? ? ? ? ? ? ? throws HibernateException
?
Persist the given transient instance, first assigning a generated identifier.
?
1.将teacher类
进行设置一个id为主键
(原来是联合主键)
?
2.在测试类中
增加测试类中的三种状态方法
TestSave3Status()
@Test
public void TestSave3Status(){
Teacher t = new Teacher();
//因为id设置的自动生成,所设置不设置是一样的
t.setName("t2");
t.setTitle("ccc");
t.setBirthdate(new Date());
t.setYourWifeName("yourWifeName1");
t.setZhicheng(ZhiCheng.A);
?
Session session = sf.getCurrentSession();
?
//在hibernate中执行操作要在一个事务里面
session.beginTransaction();
session.save(t);
System.out.println("-----------");
System.out.println(t.getId());
session.getTransaction().commit();
}
?
没有手动设置id,在save()后,进行获取t.getId()。
?
打印结果:
? ? 1
对象有三种状态的区别
? ? ? ?1.Transient ?
? ? ? ?2.Persistent ??
? ? ? ?3.Detached ??
?
基本的解释:
?
1.基本
? ? ? ?Teacher在new后,是Transient。
? ? ? ?save()方法,可以把Transient变为Persistent。
?
2.三种状态的解释:
? ? ? 1.这个对象刚new出来,设了其他值,没有设置id,这个时候称为Transient
? ? ? 2.当你调用了save()或是saveorupdate()后,变为Persistent,这种状态是有id的。
? ? ? 3.把这个session给colse()了,这时候就变成Detached
?
---------这三种状态还是不好理解的,在三种状态和其他方法混用的时候,n多的细节。
孙卫琴比较老了,annotation没有。这么去学的话,会觉得非常头大。
?
---------如果这么去学,会不好学;在实际的学习中,
记得这些方法是什么用,在实际工作的时候,实验一下,能用就用,不能用算了。
推荐的方法是实践,不是背。
?
?
3.区别主要有两点:
? ? ? ?1.有没有id ? -->Transient
? ? ? ?2.在数据库中有没有id
? ? ? ?3.在内存里有没有id
?
4.解释save()方法:
? 4.1session:
? ? ? 1.session是内存中的一个对象;
? ? ? 2.session里缓存了对象的id,session里面有个map,
? ? ? ? ?map里面有key是id,这value是对象的引用。
?
? 4.2缓存:
? ? ? ? ?内存中的一块区域,里面放着可以提高读取效率的引用或者对象
-------提高效率。
?
?
4.3由于调用save()方法,用了insert语句,
? ? commit后,调用数据库里有了key这条记录了,内存也有,
? ? ?id也有,这时候是Persistent。
?
? ? close了,key这个对象还有,已经脱离了session的管理了,
? ? 这时候是Detached。
?
?
5.总结:
对象有三种状态的区别
? ? ? ?1.Transient ? 只有内存中一个孤零的对象; 没有 id,缓存没对应的key value,数据库没。
? ? ? ?2.Persistent ? 内存中有,缓存有(是内存中的一部分),数据库有。
? ? ? ?3.Detached ? ?内存有,缓存没有,数据库有(但是和内存对象没有连接到一起),有id。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
原文:http://yuzhouxiner.iteye.com/blog/2268600