Aaron,

You've opened up a big can of worms!  There is much debate on this topic.

Regarding entity beans and transactions:  The recommended practice is to use
the 'Session Facade' pattern to wrap access to your entity beans  inside a
stateless EJB session bean.  The reason is remote calls to entity EJB's are
too slow.  Instead, only use local interfaces for you entity beans.  Your
Struts actions would never talk to entity beans directly; instead they would
call 'service' methods on session beans.  This also means you need lots of
little data transfer beans to transfer the data in and out of the session
facade.  (Or you can sacrifice explicitness and type safety and use
dyna-beans.)  The session facade also provides a good place for transaction
boundaries.  An action will usually call one method on the session bean, and
that method is a transaction.  The user hits a button, and either all his
changes or saved, or they all get rolled back.  That kind of 'atomic
request' is a nice simple transaction model that works for most situations.

However, there is a lot of extra effort involved in creating the session
facades and data transfer objects, and keeping them in sync.  Example:  the
xPetStore application, which shows how to use xDoclet, was implemented
twice, once using EJB, and once using just Servlets and Hibernate (an open
source O/R mapping tool).  Excluding the code that xDoclet generated for
you, the EJB version still had more than twice as many lines of source code
in the business tier compared to the Hibernate version.  So even with a tool
like Xdoclet, there is still significant extra cost to doing EJB.

Also, as Robert alluded to, EJB entity beans don't really support
object-oriented development.  A good OO domain model is typically fine
grained, with inheritance, relationships to other objects, etc.  The fact
that entity beans don't allow re-entrancy (object 'a' calls a method on
object 'b', which calls a method on 'a'), inhibits your entity model.  Of
course, if your business model is simple, that might be OK.

IMHO, the only compelling reason to use EJB is if you need to provide access
to remote Java clients to your business tier.  (Web services are another
option that also supports non-Java clients.  But they do add overhead.)
Even there, I would just use session beans, not entity beans.  In our app,
we're using Struts with Hibernate and doing everything in the web container.
We have a servlet filter that start, stops and rolls back the transaction;
the 'atomic request' approach.  Getting EJB out of the mix really simplified
things for us.  We do have a few cases where a remote Java client needs to
talk to our business tier, so we will probably use EJB remote session
facades for that.  But we'll only do the extra work when and where we need
it.  Hibernate allows you to declaratively cache read-only objects.  (Or
read-write too, if you're not using a cluster.)  

Ted Husted has an example app on his page using Struts and Hibernate.  OJB
is another popular option.  Long term, JDO may or may not catch on .  All of
these tools over true transparent, object-oriented persistence, in stark
contrast to EJB entity beans.

Steve


-----Original Message-----
From: Robert McIntosh [mailto:[EMAIL PROTECTED]
Sent: Tuesday, March 11, 2003 10:39 AM
To: Struts Users Mailing List
Subject: Re: [OT]: Struts, Web Development, J2EE, and what is too much?


Tony made some good points, and my take is that from your requirements, 
you may not need EJBs. However, if you layered your app sufficiently, 
then if you end up needing them later on, it shouldn't be too much of a 
problem. Of course I am assuming you are referring to Entity beans in 
this case...

As for when to use EJBs, what I have always recommended to our clients 
is that EJBs are good for large scale applications that run on clustered 
machines and require transactions at the entity bean level. The 
transactions are good if you have multiple apps and clients that are 
modifying the same data. If your app is largely read only, it is the 
only one interacting with the data and you aren't worried about 
concurrent modifcation, then you probably don't need entity beans. Yes, 
most app servers can cache and mark entity beans as read-only or mostly 
read-only for performance, but there are other ways of doing the same thing.

Another thing to consider is how your object model is designed. If you 
have lots of inheritance, entity beans aren't going to fit you well. 
Same can be said if you have complex query requirements (joins, 
relationships that the object model doesn't support, etc.).

Then again, in some cases as Nash pointed out, EJBs can be simplier from 
the perspective that any good app server can build the database for you 
and with tools like XDoclet, you don't have to write deployment 
descriptors and you don't have to maintain (i.e. code) the interfaces 
for home, remote and local.

- Robert

Aaron O'Hara wrote:

>I know this question has probably been asked before, and that biased
>publications have had their opinions on it, but I wanted to get some
>feedback regarding some "real user experience" regarding the use of EJB
>in a web application used along with Struts.
>
>I am creating a web application and I have decided to use struts.  The
>application needs to be high performance, uses a single database (so it
>doesn't have heterogeneous transactional db requirements).  I have
>designed the application in layers, and it will only have a web
>interface.  It's starting small, but will grow to have many functions.
>Even though I'm confident that I need not invest in EJB's, I don't want
>to develop the application to find out I should have used them (hence
>why I'm creating this post).
>
>In what scenarios have people found the use of EJB beneficial?  When
>have they been overkill?  Does struts integrate smoothly with EJBs?
>
>My fear is that I'll make the application overly complex by implementing
>EJBs, but I'd like to hear from people with experience building large
>web-only projects with struts.
>
>Thanks,
>
>Aaron
>
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>
>  
>


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to