Hibernate 4和使用JPA + Spring时延迟加载的改进

时间:2011-12-14 09:55:33

标签: hibernate spring jpa lazy-loading hibernate-4.x

Hibernate 4是否会对延迟加载带来任何改进?

我们正在使用Hibernate作为JPA提供程序,并希望保持我们的代码清除特定于hibernate的东西。我们不想使用Hibernate会话ojbects。在我们的应用程序中,我们也使用Spring和JSF。我们认为有一个OpenSessionInViewFilter和一个OpenSessionInViewInterceptor但是当bean处于请求范围内时,两者似乎都有效。拦截Spring会话范围(@Scope("session"))似乎不起作用。

其他框架允许bean的weavingenhancement。 Hibernate 4现在可以实现类似的功能,或者其他新功能引入哪些代码可以保持代码不受特定于hibernate的扩展? (有些配置当然可以。)

我已经检查了What's new in Hibernate 4?并看到他们在sessionfactory上工作,但我不明白它是否有帮助。

3 个答案:

答案 0 :(得分:0)

Hibernate是一个JPA实现。只需使用JPA API即可使用它,您将不再使用特定于Hibernate的代码。即使直接使用Hibernate API,也可以使用JPA注释配置延迟加载。您不需要任何特定于Hibernate的注释来使用Hibernate的延迟加载。

OpenSessionInView过滤器/拦截器没有直接链接到延迟加载。它只允许在事务结束后让会话打开。无论如何,这个过滤器/拦截器不会强迫你在自己的类中使用任何特定于Hibernate的代码,所以我真的不明白问题所在。

请注意,Spring也支持JPA(Hibernate是JPA引擎),并且具有OpenEntityManagerInViewFilter / Interceptor,它与OpenSessionInViewFilter / interceptor具有相同的作用,但是对于JPA。

答案 1 :(得分:0)

我认为你不应该在会话范围内拥有实体bean。您应该在会话范围中拥有值对象,并在必要时在请求期间加载相关的实体bean。

您使用的是Extended PersistenceContexts吗?

答案 2 :(得分:0)

hibernate 4对于其他范围的LazyLoading似乎没有任何改进,而不是请求范围。