hibernate @Nofound 与@ManyToOne fetch lazy的问题

在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专家,这东西还是不要用了.前期好像可能省不少时间,后期真是要命.

相关推荐