当前位置: 代码迷 >> Web前端 >> Hibernate基础之7:对象三种状态、增删改查时对应的状态变化
  详细解决方案

Hibernate基础之7:对象三种状态、增删改查时对应的状态变化

热度:190   发布时间:2012-11-12 12:31:58.0
Hibernate基础之七:对象三种状态、增删改查时对应的状态变化



一:Session

openSession()  和getCurrentSession():

openSession()  永远打开新session,需要session.close();
getCurrentSession() 如果现在有session,从现有的取一个

hibernate.current_session_context_class:配成 thread
是以一个连接为事务管理的边界




二:对象3种状态:

1.Transient 瞬时状态:(刚new出来)  内存中创建对象,没有分配ID(后边都有指定的ID)
2.Persistent 持久化:(save后)  从序列分配,内存中有对应项被session管理
3.Detached 脱离管理:(commit后) 放到数据库中,内存中的对象没人用了,等待被回收

状态转换如下图所示:






三:增删改查

1.save 


2.delete 

        Teacher t = new Teacher();
        t.setTeacherid(21);
        session.delete(t);

3.load和get

load返回代理对象: 

 Teacher t = (Teacher)session.load(Teacher.class,22); //主键,取出是Persistent状态
load时候没去数据库取值,而是生成一个代理,直到用的时候才会去去取

load完没用就把session关掉,之后再用的话就会报延迟加载的错误:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session

get马上回去数据库取值
 Teacher t = (Teacher)session.get(Teacher.class,22);


4.update

        Teacher t = new Teacher();
        t.setTeacherid(22);//指定主键
        t.setAge(73);
        session.update(t);
更新Detached的对象,改一个字段也会全部更新(不想更新的字段@Column(updatable=false))

get出来的Persistent对象,修改后hibernate会帮忙更新
merge()方法,合并参数进数据库,没有变动的不用改(先select去load出来,再改要改的)
推荐用HQL解决

5.saveOrUpdate

自动判断是该save还是update

6.clear

清除已经查询到的缓存

7.flush()

强制同步一下数据库和缓存




四:SchemaExport

打印完整建表语句,显示实际的建表结果:

import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; 
//...........
@Test
	public void testShow() {
		new SchemaExport(new AnnotationConfiguration().configure()).create(false,true);
	}







  相关解决方案