核心开发接口四,hibernate get和load区别

delete从数据库中把对象删除掉。删掉id号变成Transient状态。

对象必须要id号才能delete。只要有id就可以删。在Persistent和Detached状态下都可以删。

load()从数据库中取一条记录,取到内存里,把这条记录转换成对应的对象,一个对象存到数据库里的时候,转换成一条记录,反过来也可以执行。


sql语句做了一系列名字转换,hibernate自己内部处理,原因是很怕和关键字冲突,所以自己帮你做了一些转换。

load:


get和load都可以把一条记录从数据库中拿出来转成一个对象。但是他们两个之间有重要的区别,

如果我们把System.out.println(teacher.getName());都放到commit后面,

testGet(),

testLoad(),

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

出现没有session的错误。用get拿对象的时候,马上回发出sql语句,然后从数据库中取出值来,装到对象里面去,但是如果用load拿对象,load生成的是这个对象的代理,代理没有真正的发出sql语句,sql语句是你要拿出一个属性的时候才会发出。

如果我们注释掉syso那行代码,

运行结果:

发现并没有发出sql语句。

执行testGet,

区别:

1.用load方法是,当你什么时候用到sql语句才会发出,当你用get的时候,直接会发送sql语句。

load返回的是代理对象,等到真正用到对象内容的时候才会发生sql语句。而get是直接从数据库中加载。不会延迟。

2.不存在对应记录时表现不一样。Teacher teacher=(Teacher)session.get(Teacher.class, 55);没有调动的时候load不会报错,get会报错。


怎么证明这是代理对象。该对象并不是Teacher这个类的对象,而是生成代理类的对象。

class com.hibernate.model.Teacher_$$_jvst965_0  这个类可以直接生成二进制码,其父类是Teacher.



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值