Reputation: 5801
Correct me if this is an exact duplicate, I know this topic is discussed often but can't find a definitive answer.
The question:
What is the best practical solution to handling Hibernate objects in a MVC webapp?
The details:
I am using Hibernate and want to leverage lazy loading where possible.
I am working in a MVC style webapp.
I hate getting lazy load initialization exceptions.
I hate having to reattach Hibernate objects between transactions.
The options:
hibernateObject.getRelatedObjects()
but need to say something like springService.getRelatedObjects(hibernateObject)
Am I missing something?
Have I over-thought things?
Have I under-thought things?
PS:
For a web framework I'm using ZK but don't really want a ZK specific answer.
I'm also using Spring and am cool with a Spring specific answer as it's so ubiquitous.
Upvotes: 7
Views: 4060
Reputation: 783
There are three ways:
Use eager fetch load for your attributes: Can be a problem if you have a big datatable.
Use a filter called OpenSessionInView: this filter will keep the session open until the full load of your web page. If any hibernate object was request in this load, the session will be opened and will avoid lazy loading exception.
User VOs (Valueble Objects): In your application, will have 2 kinds of objects. A object to pass between the persistence and business layer, and a object for you view layer. For example, UserVO and UserModel. A vo will be used to transport information between view and business layer. In your business implementation, you will use the vo to fill the model object to send it to you persistence layer. Using this pattern, you wont have more lazy load exception because all needed information will be filled in your vo object when is necessary.
Some references:
OpenSessionInView
Eager Fetching Load
Hibernate Performance tips
Upvotes: 3
Reputation: 10055
Mixing the Presentation layer with the Data Access layer is a design issue.
Your View should access the Model through a Controller, but by using Hibernate objects directly you're mixing layers. IMO Data Access should be another layer below the Model. Even if your entities are annotated or defined in an xml they're separate from the model per se.
Introduce a Facade or a Manager that encapsulates the Hibernate logic and expose it through a service contract for the controllers, returning meaningful objects that represent those entities. If any, I'd go for option 4.
Upvotes: 1
Reputation: 18170
Use 4-ish - Don't use open session in view, don't have your hibernate entities bubble all the way up to the view instead have transformers translate between the hibernate entities and your domain objects or 'view beans' depending on how you want to work it.
I think of Hibernate entities as just a persistence strategy not a domain model or UI representation.
Upvotes: 5