rhinds
rhinds

Reputation: 10043

Spring annotation based configuration change

I have a spring MVC (3.1) web app using Hibernate that is all working correctly - today, I have tried to move the configuration completely over to annotation based config (only using xml for the security stuff that isnt yet supported by Spring in code config).

After some tuning I got the app starting with no errors and the home page loads correctly - however I am seeing some different behaviour with the Hibernate sessions - namely, I am getting the following error when loading a page that actually touches Hibernate entities:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.tmm.web.domain.Profile.connections, no session or session was closed

This is happening in the following scenario:

  1. a request hits my @Controller and it loads the user Profile object
  2. In the same method call (so we are not talking detached entities etc here) it tries to call profile.getConnections()
  3. Profile.connections do not actually explicitly state a fetchtype, so should default to eager load (is my understanding?), but either way, the getConnections() call is directly after the loading of the profile - so would have thought even if it was being loaded lazily, it could easily just go back to the DB and load connections on demand.

    //@Controller Code Account viewedUser = accountService.loadAccountByUserName(userName); model.put("viewedUserConnections", viewedUser.getUserProfile().getConnections());

    //Profile Entity @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List connections = new ArrayList();

Now, I know about lazy loading etc, so it's not a question about that - like i mentioned all the Hibernate stuff was working correctly - so really my question is, what Spring configuration might affect this behaviour?

I can post my before and after xml vs annotation config, but am hoping that someone can point me in the direction of some config that I might have missed in switching.

Upvotes: 0

Views: 227

Answers (1)

JB Nizet
JB Nizet

Reputation: 691625

Your assumptions are mainly wrong:

In the same method call (so we are not talking detached entities etc here)

The method is a method of the controller. In typical Spring applications, controllers are not transactional, but services are. So, unless you configured an "open session in view" filter or interceptor, the session is closed when the transactional service method returns, and the controller thus always uses detached entities

Profile.connections do not actually explicitly state a fetchtype, so should default to eager load

No. XxxToMany associations are lazy by default.

If the same code worked before the transition, my guess is that you had an open session in view filter or interceptor, and that you forgot it when migrating to annotations.

Upvotes: 2

Related Questions