Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC With Lazy Loading

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:

  1. Eager load everything
    • Solves the lazy initialization problem but makes my queries bigger
  2. Use some 'Open Session in View' concept
    • I love the simplicity of it
    • Objects still need to be reattached, and in an AJAXy setup, quite frequently
    • A session is opened for EVERY request
  3. 'touch' items I need before leaving the transaction
    • Seems flimsy at best.. and tedious
  4. Create different, simplified, 'detached' objects so the view never sees real Hibernate objects
    • These could be simpler than full Hibernate objects so it's not like a full eager load of the model
    • I've heard this recommended in places to but just seems like more liability/code/work
  5. Open a session when ever I want to interact with Hibernate objects.
    • This can be wrapped up in a Spring Service layer pretty nicely, but seems excessive at times. Eg: I want 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.

like image 888
Sean Connolly Avatar asked Jan 16 '13 14:01

Sean Connolly


People also ask

How lazy loading is implemented in MVC?

You can do pagination and load your data based on demand. Here I will explain step by step from scrach, an application to implement lazy loading using ajax call. I have attached the source code for this demo. Select MVC option from the next screen and click on ok button which will create a new project for you.

Is lazy loading good C#?

Lazy loading is essential when the cost of object creation is very high and the use of the object is vey rare. So, this is the scenario where it's worth implementing lazy loading. The fundamental idea of lazy loading is to load object/data when needed.

Does Entity Framework support lazy loading?

Entity Framework supports three ways to load related data - eager loading, lazy loading and explicit loading.

Which entities allow lazy loading?

Yes, lazy loading is enabled in the Entity Framework ORM too, it is on by default in Entity Framework, so if you want to enable lazy loading in Entity Framework, you don't need to do anything.


2 Answers

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.

like image 188
blank Avatar answered Sep 28 '22 00:09

blank


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

like image 42
Marcio Barroso Avatar answered Sep 28 '22 00:09

Marcio Barroso