核心开发接口四,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.