ITEEDU

Hibernate-load和get的区别

load和get都是Hibernate中用来获取对象的方法,参数都是一个对你的id值。

区别:

get在调用时会生成对象实体,加载数据库中的数据。没有对应数据时返回null。

load调用时只会生成一个代理对象,只有在使用对象时才会从数据库中加载数据。如果没有对应id的数据就会抛出异常。

我觉得load抛出异常是因为没法确定对应id数据是否存在,在调用时一般是调用get方法获取属性值,如果返回null是属性值为空还是对象不存在呢。所以只能通过抛出异常来解决了。

get对象不存在时可以通过if判断来处理下面逻辑,而load就要放在catch中了,这也是没办法的事吧。

load方法实现了懒加载(lazy-load)。什么时候用呢?在加载数据量大,耗时长时用load可以加快速度,毕竟只是创建代理对象没有从数据库加载数据。如果加载时还要读对象属性,load就不行了,还不如直接创建对象加载数据呢。

load的代理对象是用CGLIB来创建的,可以在调试时看看load创建的对象什么结构。CGLIB不需要类实现任何方法,代理对象是通过继承类来实现代理功能。代理类是被代理类的子类,所以可以直接赋值。

代理对象如图:

生成的代理对象中的target属性对应的才是真正的实体。而且只有在调用时才会加载。