-
1. Re: deisgn: adding service and DAO layers
nitingaur.nitin.gaur.keane.com Jan 6, 2011 6:02 AM (in response to asookazian)I was searching for similar design pattern and came across this post. Not answering but putting my query here...
We decided to use service layer in between UI and SAF classes (EntityHome/EntityQuery). Basically idea is to intercept user actions to create placeholder for business logic and more control over framework operations such as logging, exception handling and security.
Home and Query objects are injected in Service class. I want to figure out which of the Home/Query methods should/must be intercepted in service class. Want to fix it at early stage of project so that I can declare all methods in an interface that any Service class will implement to avoid confusion. Any suggestions please...
-
2. Re: deisgn: adding service and DAO layers
isonisak Jan 6, 2011 9:22 AM (in response to asookazian)Seam encourages to use EJBs as JSF backing beans.
This might be too straighworward solution if high security and high load
is in question.So traditional web layer (machine) and service layer (ejb machine)
is required and firewals in between.How in this case Seam transactions and conversions work across all layers ?
-
3. Re: deisgn: adding service and DAO layers
serkan.s.eskici.online.nl Jan 6, 2011 2:09 PM (in response to asookazian)Well, I adhere to what Seam encourages to do, namely using your backing beans as services with some little
optimalizations
.For example, if you have the same (complex) JPA queries across multiple classes, then you can refactor these as NamedQueries into the EntityBean, holding them in 1 place.
So this way you can avoid double code and the need for a DAO layer (and extra unneccessary injection and memory costs).
However, there was 1 situation where I had to define a DAO layer and that was because the system architecture was not allowing us to deploy the whole application into 1 EAR.
So we had to deploy our DAO layer to another machine and making remote calls from the front-end to use it.
Actually there is no good reason for making use of a layered architecture if your app is inside 1 EAR. Just realize that you're component based programming with Seam and thus you get the same loosly-coupling advantages with it as in layered architecture (with DI & Events).
Just my 2 cents...
-
4. Re: deisgn: adding service and DAO layers
isonisak Jan 6, 2011 2:39 PM (in response to asookazian)But if for security resons you have to make
web- and service(ejb) apps in separate machines, can
the Seam conversation handle also ejb-layers database
operations or how this should be done ? -
5. Re: deisgn: adding service and DAO layers
serkan.s.eskici.online.nl Jan 7, 2011 5:30 AM (in response to asookazian)
Sakari Isoniemi wrote on Jan 06, 2011 14:39:
But if for security resons you have to make
web- and service(ejb) apps in separate machines, can
the Seam conversation handle also ejb-layers database
operations or how this should be done ?I know that Seam provides conversational Web-/REST services (check the documentation for more info), however I've never experimented with this.
Well, what you also can do is, keeping things simple:
- Make the service layer stateless either by defining it as SLSB, Webservices or REST.
- Keep the (conversation) state in the weblayer.
My own preference goes for REST. Because it's simple and easy setup and you can negotiate in the response with HTTP status messages. For example, if the database transaction in the service layer goes wrong, then you can send a HTTP 400 (or something) to the client to notify him that he also should rollback or undo his stuff.
This also has the advantage that the service layer is more scalable and cachable, although I prefer configuring caching right directly in the dbms than in the application layer but that's just another story :)
-
6. Re: deisgn: adding service and DAO layers
nitingaur.nitin.gaur.keane.com Jan 7, 2011 6:19 AM (in response to asookazian)
Sakari Isoniemi wrote on Jan 06, 2011 09:22:
Seam encourages to use EJBs as JSF backing beans.Thanks Sakari and Serkan
Well, We found hot deployment feature of JavaBeans very useful in development. EJB can not be hot deployed.
And we do not want add more than one layer between UI and DAO else it will drift away from what Seam recommends (less layers)JSF -- POJO (service) -- POJO (DAO) -- Entity class
So in above flow, service (implemented as POJO) is action listener apart of containing service methods. Use of service also avoids any changes in EntityHome/EntityQuery objects. DB is existing so seam-gen reverse engineering works in our favour and generates UI and DAO (Home/Query).
However, packaging is still an EAR so that EJB door is open if required for any other work (WS, JMS etc)
Coming back to my original question - till now we are thinking that service should contain only action listener methods while it seems OK to expose other Home/Query methods (ex - managed, wire, getresultcount etc) directly to UI.
-
7. Re: deisgn: adding service and DAO layers
isonisak Jan 7, 2011 4:20 PM (in response to asookazian)After reading Allens great book Seam In Action, I
understood that distributed arch with conversion managed
global transactions can be achived with XA , that all
participants support.
Prerequisite is that Seam managed tranactions are used.
Using distributed transactions in a Seam application.
One of the main reasons for using JTA transactions is to take advantage of distributed transactions. Despite Seam wrapping global transactions around each request, only the JTA implementation can support distributed transactions. In that case, you can work with multiple persistence managers and get two-phase commits as long as the underlying data source is configured as an XA resource. Chapter 14 (online) demonstrates how to set up XA data sources in the sample application.If WebService (REST) ach is more suitable then like
Serkan above suggested, that EJBs live in their own
transaction scope, that is different from Web layers
scope and conversion must be manually rolled back if
EJB-operation fails.
In this scenario can occur problems if Web layer conversion
is shorter than EJB-layers transaction scope.