find,iterator
(1)iterator首先会获取符合条件的记录的id,再跟据id在本地缓存中查找数据,查找不到的再在数据库中查找,结果再存在缓存中。N+1条SQL。
(2)find跟据生成的sql语句,直接访问数据库,查到的数据存在缓存中,一条sql。如果找不到符合条件的纪录,get()方法将返回null.
如果找不到符合条件的纪录,find()方法将返回null.
如果找不到符合条件的纪录,load()将会报出ObjectNotFoundEcception.get()方法会忽略二级缓存,若内部缓存没有查询到会到数据库中去查询 .
find()方法会忽略二级缓存,若内部缓存没有查询到会到数据库中去查询 .
load()方法可以充分利用hibernate的内部缓存和二级缓存中的现有数据 .get()方法返回真实的实体类 .
find()方法返回真实的实体类 .
load()方法可以返回实体的代理类 .load()会因所要查询的对象类的映射文件中设置的检索策略,而实现立即检索或延迟检索。
get()方法和find()方法却不受这种控制,它们总是会执行立即检索。----------------------------------------
大家看看上面列出的那些都是对的吗?
get与find的区别在哪?
(1)iterator首先会获取符合条件的记录的id,再跟据id在本地缓存中查找数据,查找不到的再在数据库中查找,结果再存在缓存中。N+1条SQL。
(2)find跟据生成的sql语句,直接访问数据库,查到的数据存在缓存中,一条sql。如果找不到符合条件的纪录,get()方法将返回null.
如果找不到符合条件的纪录,find()方法将返回null.
如果找不到符合条件的纪录,load()将会报出ObjectNotFoundEcception.get()方法会忽略二级缓存,若内部缓存没有查询到会到数据库中去查询 .
find()方法会忽略二级缓存,若内部缓存没有查询到会到数据库中去查询 .
load()方法可以充分利用hibernate的内部缓存和二级缓存中的现有数据 .get()方法返回真实的实体类 .
find()方法返回真实的实体类 .
load()方法可以返回实体的代理类 .load()会因所要查询的对象类的映射文件中设置的检索策略,而实现立即检索或延迟检索。
get()方法和find()方法却不受这种控制,它们总是会执行立即检索。----------------------------------------
大家看看上面列出的那些都是对的吗?
get与find的区别在哪?
对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。 2、虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。 3 get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。 总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
GET, 一般情况下用, 返回空。
FIND, 没用过
怎么没人指点下呢?