nameFay 2014-10-28
在hibernate上
@oneToOne,@ManyToOne,@OneToMany这些注解上可以设置
fetch=FetchType.LAZY
但是如果在这些注解上在加上
@NotFound(action=NotFoundAction.IGNORE)
则懒加载失效,会变成立即加载.(在程序中会带来很可怕的效应).产生n+1查询.
所以要使用fetch=FetchType.LAZY时,要把@NotFound给去掉
估计hibernate在看到@NotFound时,会先去数据库里看看是不是有这数据,这样就产生了查询,让懒加载失效了.
以上在hibernate4.3.6版本上有这个问题.不知道是不是hibernate自身的问题
具体可参见
http://stackoverflow.com/questions/15666042/hibernate-manytoone-n1-issue
http://stackoverflow.com/questions/222453/how-to-stop-hibernate-from-eagerly-fetching-many-to-one-associated-object
也有好些中文的:
http://www.cfanz.cn/?c=article&a=read&id=74847
http://blog.csdn.net/beyond667/article/details/8836805
ps:
用好hibernate真心不容易.要是项目组里没有hibernate专家,这东西还是不要用了.前期好像可能省不少时间,后期真是要命.