Sounds like you're using a data transfer (tree)map pattern, this is
largely similar to the rowset version except for the following:
* You have to copy values from the underlying data access
solution into the TreeMap
* Your view component needs to know about the contract for
attribute keys in the map (or perhaps not, perhaps this is
why you are using a TreeMap)
In the rowset version you would wrap a disconnected recordset along with
some meta data then use this meta data in your view component e.g.
iterate over the metadata to output column headers for your table, then
iterate over the data rows to output your data rows.
Which is better? No cut and dried answer but here are the pros and cons
for both so that you can decide.
Rowset Approach
---------------
Pros:
* Common interface for all general purpose, read only query
operations
* Enables you to write generic table display code by using
taglibs to iterate over the rowset/map
* Responds well to change - the absence of a data translation
layer coupled with the use of generic table display code
leaves you view indifferent to changes in the underlying
data set
Cons:
* Clients need to know the name of database table columns
* Bypasses the domain model, breaks some rules about separation
of responsibilities (this shouldn't be a showstopper if it is
used in carefully controlled situations such as displaying
read only data in a tabular manner)
* Loss of type safety (no compile time checking)
Map Approach
------------
Pros:
* Minimises the data translation layer (assuming you can generically
translate a record set into a map)
* Enables you to write generic table display code by using
taglibs to iterate over the rowset/map (assuming you can make
assumptions about the order in which the map entries are stored)
* Responds well to change - although not as well as the rowset version
Cons:
* Clients need to know about the contract governing the naming of the
map keys
* Loss of type safety (no compile time checking)
* You'll need to wrap primitives and most access will require casting
-----Original Message-----
From: Tom Ziemer [mailto:[EMAIL PROTECTED]
Sent: 18 August 2005 15:52
To: Struts Users Mailing List
Subject: Re: [OT] Loading data for view
Thanks for your answers.
I added a new method to my DAO that allows me to execute predefined
queries and returns kind of "general-purpose-dto"s, that only consist of
a treemap which stores the requested values from the db. So I get one
g-p-DTO per row in my ResultSet that can be passed to the view for
rendering.
Is this a bad design? Is the "Transfer RowSet pattern" suggested by Colm
a cleaner approach?
I am wondering whether this is not a common problem for any application
that is based on database with a hierarchical design. Most of the time
you won't need an entire object tree but only parts of it.
Regards,
Tom
Frank W. Zammetti wrote:
Sometimes the simplest answer is the best... and even when it isn't
the
best, it's *still* simple :) ...
How about just creating a new DAO/DTO that only contains the data you
need?
It would be a duplication to a degree, but that's not *always* an
absolutely evil thing... especially since it sounds like the new A
object
you want to display on the page may not truly model a real domain
object
(where they others I presume are) but is instead something of a
hybrid, I
could personally live with this.
Either that, or I would just create a single Miscellaneous DAO that
has
methods that don't *quite* fit in other DAOs... maybe this is one of
them... then you would still have a DTO for this particular case, and
a
new one for each particular case in the DAO, if any more came up.
FYI, most of my apps have the true DAO/DTOs, but they all also have
such a
miscellaneous class for handling things exactly like this. There tend
to
be very few such cases, but they do come up, and I find this to be a
nice
way to organize them. In fact, in a couple of cases I've decided to
make
the DTOs inner classes of the DAO, just to make it obvious they are
related and probably limited in their use cases.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------
If you are not an intended recipient of this e-mail, please notify the sender,
delete it and do not read, act upon, print, disclose, copy, retain or
redistribute it. Click here for important additional terms relating to this
e-mail. http://www.ml.com/email_terms/
--------------------------------------------------------
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]