例1-
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
tx.begin();
StuClass sClass = new StuClass(); //new 一个StuClass对象
sClass.setCname("bbbbbb");
session.save(sClass);
tx.commit();
commit()之后这个sClass对象是什么状态?
session.close();
close()之后这个sClass对象是什么状态?
如果是游离态的 那为什么我
System.out.println(sClass.getCname());
System.out.println(sClass.getId());之后还能取到 属性值? 还是说游离态本来就有属性值?~ 是不是游离态只有一个oid和数据库的一条记录对应!!?
例2
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
tx.begin();
StuClass sc = (StuClass) session.load(StuClass.class, new Integer(1)); //从数据库加载Id是1的 StuClass对象!
session.save(sClass);
tx.commit();
//这里我能取到这个sc对象的 的name 和 id 这个时候它是什么状态?
System.out.println(sc.getCname());
System.out.println(sc.getId());
session.close();
//关闭session之后!!!
System.out.println(sc.getCname());
System.out.println(sc.getId());
如果我单纯的取ID 就能正常取到
但是如果我取name就会报异常!!
这个时候sc是什么状态?
谢谢了 !!!! 辛手!
例1:
commit()之后这个sClass对象是持久态,
session.close();后这个对象是游离态,session已经关闭,不被hibernate管理了,是一个普通的JAVA对象,当然可以取到里面的属性
例2:
tx.commit();之后是持久态,因为load默认延迟加载,sc.getCname()时会发sql去数据库查询
session.close();之后是游离态,因为session已经关闭,sc是load方法加载上来的,里面的属性并没有从数据库里面查出来,这个时候你取name时,因为session已经关闭,无法从数据库里面查询,所以报错
PS:load方法默认延时加载对象的属性(hibernate帮你用了代理),如果你不想延时加载,用get方法