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);
	}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值