Loading ...
Sorry, an error occurred while loading the content.

Re: [agileDatabases] Re: Accessing the db from a Java app (Stored Proc or Hibernate or Other)

Expand Messages
  • Andrew Gregovich
    I agree with this last post apart from your last comment - application vs DB. I don t see a differentiation between the application and the DB . If you look
    Message 1 of 23 , Nov 30, 2006
    • 0 Attachment
      I agree with this last post apart from your last comment - application vs DB. I don't see a differentiation between the "application" and the "DB". If you look at it from the functional perspective you have one product/solution, that's it (back in the old days people used to write their own DBMSs). You can choose Berkeley DB which is a non-SQL based DB which can use a special Java API. Is that DB or application? There are many different ways to solve a problem and if you stick to the DB vs app paradigm you're automatically limiting your choices... which is not what XP is about...

      ----- Original Message ----
      From: Hugo Garcia <hugo.a.garcia@...>
      To: agileDatabases@yahoogroups.com
      Sent: Thursday, November 30, 2006 10:25:25 PM
      Subject: Re: [agileDatabases] Re: Accessing the db from a Java app (Stored Proc or Hibernate or Other)













      That was the point I was trying to make and putting it inside the context of

      an Agile Development (not XP only). Afterall... this is the Agile Databases

      list. For those of us that do practice Agile Development. .. I was not

      discussing "Why to use one or the orther" rather... "When in the process

      should you think about it and how much to impelement?" also "How to approach

      it...in very general terms."



      Stuarts comments on his choices are exactly the ones I had to choose to

      implement. I have nothing against SP... I do have evething against letting

      the db dictate the developement of an application. It should be a dialog

      between the developers and the dba and not a fight of which technology is

      best and more efficient but rather which one works.



      -H



      On 11/30/06, Andrew Gregovich <andrew_gregovich@ yahoo.com> wrote:

      >

      > Yes, I completely agree with this approach - pick the best tool for the

      > job. Hibernate can be very useful in these situations and many other ones,

      > but as illustrated you'll often need to mix and match different paradigms to

      > get the optimial result, both in terms of development, future maintenance

      > and performance. Sticking with any single particular

      > methodology/ tool/framework will unnecessarily limit your choices and will

      > get you in trouble sooner or later...

      >

      > ----- Original Message ----

      > From: Stuart Caborn <stooferus@gmail. com <stooferus%40gmail. com>>

      > To: agileDatabases@ yahoogroups. com <agileDatabases% 40yahoogroups. com>

      > Sent: Wednesday, November 29, 2006 8:40:00 PM

      > Subject: Re: [agileDatabases] Re: Accessing the db from a Java app (Stored

      > Proc or Hibernate or Other)

      >

      > I think the choice about SP's over Hibernate depends upon the problem that

      >

      > you are trying to solve. Its not so much a matter of religious conviction,

      >

      > rather picking the most suitable tool for the job.

      >

      > For example, in the last application I was involved in which was serious

      >

      > about the DB we had three major problems to solve:

      >

      > (1) Search and query features were required to be extremely flexible and

      >

      > support ad hoc db queries

      >

      > (2)We had to insert large amounts of data into the system and process them

      >

      > quickly.

      >

      > (3)We had to support multiple databases

      >

      > To solve the first problem we used Hibernate - as it is much simpler to

      >

      > build a conditional query in the application that to do so using SPs. In

      >

      > fact the majority of DB access used Hibernate by default as development

      > was

      >

      > quicker - TDD support for SPs just isn't as good as in Java-land.

      >

      > To solve the second problem we used SP and DB specific tricks. Even though

      >

      > we had to support multiple databases it was worth maintaining multiple

      > sets

      >

      > of stored procs as there was no way we could achieve the performance we

      >

      > needed with an OR mapper.

      >

      > To mitigate the third problem we used an Hibernate wherever possible - but

      >

      > this did not mean that we did not have to tune the database regularly

      > during

      >

      > application development and refactor app/SPs/schemas to keep performance

      > and

      >

      > portability up. We also flirted with templating tools to allow us to

      > mantain

      >

      > SPs for multiple databases.

      >

      > Just my 2p

      >

      > Stu

      >

      > On 28/11/06, Andrew Gregovich <andrew_gregovich@ yahoo.com> wrote:

      >

      > >

      >

      > > Stored procedures are not data - they are pieces of code just like Java,

      >

      > > C or any other piece of code. They are 3GL but can have embedded SQL in

      >

      > > them, so they tend to be quite a bit more compact when you look at them

      > than

      >

      > > e.g. JDBC code. SQLJ is also another example of a 3GL+embedded SQL

      >

      > > technique, but (in my opinion unfortunately) nobody took it very

      > seriously.

      >

      > > Anyway, if you have no data that needs to be stored or accessed,

      >

      > > you're right - no need for a DBMS let alone stored procedures.

      >

      > >

      >

      > > Now presuming that you do have data to access or store, especially a lot

      >

      > > of data, if you're going back to your DBA only after you've done your

      >

      > > application design then either:

      >

      > > 1) You have already a pretty good idea of efficient DB design, or

      >

      > > 2) You are writing a relatively low-volume applications (thousands

      > rather

      >

      > > than millions of records/objects retrieved/stored per day), or

      >

      > > 3) You'll end up rewriting quite a bit of your design, or

      >

      > > 4) Eventually you'll run into big problems

      >

      > >

      >

      > > I witnessed 4) over and over, once the volume goes up the DB is the

      > first

      >

      > > layer to feel the pain and most often it's not viable to solve it

      > anywhere

      >

      > > but at the DB level. As time goes by, then the managers invest more into

      > DB

      >

      > > resource and migrate more performance- critical business logic

      > implementation

      >

      > > into the DB (which BTW does not violate the Domain Driven Design

      >

      > > principles). Now, you can wait to do this painful migration until it

      > starts

      >

      > > to hurt badly, or you can proactively try to design an efficient

      > solution.

      >

      > >

      >

      > > Lastly, XP in essence is in a way contradictory to Domain Driver Design

      > -

      >

      > > it says build the simplest thing possible and refactor only when

      > necessary.

      >

      > > If you have very simple apps, you don't need tons of layers that hide

      >

      > > implementations etc... you're just creating layers for the sake of

      > creating

      >

      > > layers. DDD starts paying off when you have systems dealing with complex

      >

      > > domains, which even Eric Evans states clearly. On the other hand, I wish

      > I

      >

      > > knew that there's some magic formula, some golden rule that'd be used

      > for

      >

      > > guidance of how many layers are necessary to solve certain problems, but

      > I

      >

      > > don't know any, so I just use my gut feel (which is basically

      > experience).

      >

      > >

      >

      > > ----- Original Message ----

      >

      > > From: Hugo Garcia <hugo.a.garcia@ gmail.com <hugo.a.garcia% 40gmail.com>

      > >

      >

      > > To: agileDatabases@ yahoogroups. com <agileDatabases% 40yahoogroups.

      > com>

      >

      > > Sent: Tuesday, November 28, 2006 6:47:25 PM

      >

      > > Subject: Re: [agileDatabases] Re: Accessing the db from a Java app

      > (Stored

      >

      > > Proc or Hibernate or Other)

      >

      > >

      >

      > > Let me be more specific about my experience:

      >

      > >

      >

      > > I build complete RCP applications and not just a couple of plug ins. For

      >

      > > me

      >

      > >

      >

      > > understanding the business process to which technology will be applied

      > is

      >

      > >

      >

      > > the prime concern. User interaction and user usability are the most next

      >

      > >

      >

      > > important aspects of the application. While using Agile Development. ..

      >

      > > work

      >

      > >

      >

      > > from the user stories that define the business process [aka the business

      >

      > >

      >

      > > rules] and that also define how the user will accomplish the business

      >

      > >

      >

      > > process by interacting with the system. Do not think in terms of data...

      >

      > >

      >

      > > think in terms of process and interaction.

      >

      > >

      >

      > > Take those business process stories and use Domain Driven Design to

      > build

      >

      > >

      >

      > > the Domain Model in a programming language and do not think of the db if

      >

      > > it

      >

      > >

      >

      > > doesn't exits. If it exits then ignore it until you have a first good

      >

      > >

      >

      > > release of the application that accomplishes the basic business process

      >

      > > that

      >

      > >

      >

      > > you want to implement.

      >

      > >

      >

      > > Use an application specific db and not the tables that have been already

      >

      > >

      >

      > > created. How a DBA sees data and how an application developer will use

      > it

      >

      > >

      >

      > > are not the same. Let the application domain model drive the db model as

      >

      > > the

      >

      > >

      >

      > > application evolves during multiple iterations. Once a good stable

      >

      > >

      >

      > > implementation of the application is finished then seriously sit down

      > with

      >

      > >

      >

      > > your DBA and discuss how the application db can be integrated and

      >

      > > optimized

      >

      > >

      >

      > > with the rest of the non application tables that might be effected. This

      >

      > > is

      >

      > >

      >

      > > the point when the question "Do I use SP or not?" will be easier to

      >

      > > define.

      >

      > >

      >

      > > For building the DAO's, do not use HQL... stick to the Criteria API. Do

      >

      > > not

      >

      > >

      >

      > > use emebeded SQL. If you find yourself in need of a complex SQL call

      > then

      >

      > >

      >

      > > talk to your DBA since this might be a candidate for an SP.

      >

      > >

      >

      > > Give a copy of Domain Driven Design to your DBA and buy him his favorite

      >

      > >

      >

      > > caffeinated beverage. Do read "Refactoring Databases".

      >

      > >

      >

      > > The above is just one way of how to approach application development

      > with

      >

      > >

      >

      > > both a methodology for completing the application (XP, Scrum, etc) and a

      >

      > >

      >

      > > methodology on the building the application (Domain Driven Design). Not

      >

      > > many

      >

      > >

      >

      > > Java developers have both and most have neither an thus we end up with

      >

      > >

      >

      > > discussion of specifics of SP, PL/SQL vs HQL battles that are

      > nonsensical.

      >

      > >

      >

      > > -H

      >

      > >

      >

      > > On 11/28/06, Andrew Gregovich <andrew_gregovich@ yahoo.com> wrote:

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > The last post just illustrates the general lack of awareness I

      >

      > >

      >

      > > > encountered of (mostly Java) application developers when it comes to

      >

      > > other

      >

      > >

      >

      > > > development languages/platforms including DB. I've heard people

      > writing

      >

      > > Java

      >

      > >

      >

      > > > classes that implement a TOP X (ROWNUM <= X in Oracle) feature with

      >

      > > ORDER BY

      >

      > >

      >

      > > > because it was "clean". Is this a business rules domain? Sure it is...

      >

      > > but

      >

      > >

      >

      > > > I'd rather have 1 line of code than 100, so I don't quite see the

      >

      > > absolute

      >

      > >

      >

      > > > need for the clean business layer in all cirumstances. T-SQL, PL/SQL,

      >

      > > etc

      >

      > >

      >

      > > > are pretty flexible development environments when it comes to most ERP

      >

      > >

      >

      > > > applications and in most cases you don't need OO features such as

      >

      > >

      >

      > > > inheritance/ polymorphism etc (the latter is supported by PL/SQL BTW).

      >

      > > On the

      >

      > >

      >

      > > > other hand, when you have SPs, seeing dependencies between DB objects

      >

      > > and

      >

      > >

      >

      > > > themselves is a useful feature - when you break something it in most

      >

      > > cases

      >

      > >

      >

      > > > triggers invalidation which you won't see if you embed SQL code

      >

      > > elsewhere.

      >

      > >

      >

      > > > Unless you have other good

      >

      > >

      >

      > > > tools... but then again most Java developers are happy with Eclipse

      > and

      >

      > > a

      >

      > >

      >

      > > > handful of plugins.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > I do agree that Hibernate is very useful for CRUD operations but there

      >

      > > are

      >

      > >

      >

      > > > times when it misbehaves if used in conjunction with plain JDBC calls

      >

      > > (which

      >

      > >

      >

      > > > is usually not well known by average Java devs). For more complex or

      >

      > >

      >

      > > > performance- sensitive operations the DB is usually the bottleneck

      >

      > > anyway, so

      >

      > >

      >

      > > > you'd need someone with good SQL/DB tuning skills (or a fancy new

      > tool)

      >

      > > to

      >

      > >

      >

      > > > optimize the data retrieval. You can put all this code into HQL but

      > then

      >

      > >

      >

      > > > Hibernate is too limited to combine Java methods with complex HQL so

      >

      > > there's

      >

      > >

      >

      > > > no added value there apart from converting the records back into

      > objects

      >

      > >

      >

      > > > (which again, are usually not needed anyway).

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > ----- Original Message ----

      >

      > >

      >

      > > > From: Hugo Garcia <hugo.a.garcia@ gmail.com <hugo.a.garcia%

      > 40gmail.com>

      >

      > > >

      >

      > >

      >

      > > > To: agileDatabases@ yahoogroups. com <agileDatabases% 40yahoogroups.

      >

      > > com>

      >

      > >

      >

      > > > Sent: Monday, November 27, 2006 11:12:39 PM

      >

      > >

      >

      > > > Subject: Re: [agileDatabases] Re: Accessing the db from a Java app

      >

      > > (Stored

      >

      > >

      >

      > > > Proc or Hibernate or Other)

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > I would like to comment on my experience.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > For loading the persistent model from the db to memory then use

      >

      > > Hibernate

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > direct to views/tables. For update and creation of new persistent

      > domain

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > objects then you might want to use SP especially if the fields that

      > have

      >

      > >

      >

      > > > to

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > be updated or the record that have to created are spread across

      > multiple

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > tables. If the data is updated periodically via an external feed then

      >

      > > you

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > might want to use SP to keep everything synchronized. As far as using

      > SP

      >

      > >

      >

      > > > to

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > manipulate the domain model data..... I prefer to let my UI handle

      > that.

      >

      > > I

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > use a heavy client based on Eclipse and not the J2EE or Web

      > 2.0paradigm.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > The flexibility of being able to implement a truly stateful and

      > dynamic

      >

      > >

      >

      > > > MVC

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > pattern is priceless since the business rules can be easily

      > encapsulated

      >

      > >

      >

      > > > in

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > your domain model (Java, C++.... whatever code) and not in the db. I

      > am

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > weary of using SP for business rule implementation.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > -H

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > On 11/27/06, Scott Ambler <scottwambler@ yahoo.com> wrote:

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > Pros:

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > 1. You can process a lot of data and produce a small

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > result without taking the hit of moving the large

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > amount of data across the network.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > 2. You can implement common functionality in the DB,

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > something that many platforms can easily access.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > 3. You can encapsulate DB access.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > Cons:

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > 1. Difficult to port to another vendor.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > 2. There's better ways to encapsulate DB access.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > 3. Testing tools aren't as robust (yet).

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > 4. Refactoring tools aren't as robust (yet)

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > Bottom line: There are trade-offs with using SPs. It

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > makes sense to use them in some situations but not

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > others. As Agile Data's sixth philosophy tells you:

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > avoid the extremes (i.e. no SPs at all or everything

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > in SPs) and instead find the sweet spot for your

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > situation.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > - Scott

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > --- Carfield Yim <carfield@gmail. com <carfield%40gmail. com>>

      > wrote:

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > I've collected some link about pros and cons of

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > using SP, see if you

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > interested to take a look -

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > http://www.carfield .com.hk/weblog/ database/ arguments+

      >

      > >

      >

      > > > for+and+against+ using+stored+ procedures. txt?wrapped= true&

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > Hi

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > Not an expert at this time in Hibernate, but my

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > thoughts:

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > 1. If you're planing to use only one DBMS

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > 2. If your dba's can garantee that their SPs

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > better optimised than

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > Hibernate-generated code (and maybe SPs all

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > writen and time proven).

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > 3. If user rights management based on grants to

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > SPs

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > 4. Hibernate is on client, not on middle-tire and

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > network traffic is

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > valueble.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > Why not use SPs?

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > If you don't like JDBC - you can use inline

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > queries from Hibernate,

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > aren't you?

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > In our company (www.billonline. ru/en) we are

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > planning to use Hibernate.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > Our concern is targeting many DBMS.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > Now we have well-optimised SQLServer-only billing

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > system.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > At this point we have everything on SPs. But SPs

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > called only from

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > middle-tire.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > Our first step:

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > 1. Well-optimised time-proven SP-based

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > SQLServer-version

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > 2. Hibernate-versions for other DBMS (To be

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > precisely correct -

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > NHibernate)

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > Next step:

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > 1. We planning to refactor not critical SPs to

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > Hibernate in SQLServer.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > 2. Refactor critical hibernate code to target

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > choosen DBMS SPs if

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > > needed/possible.

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > Scott W. Ambler

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > Practice Leader Agile Development, IBM Methods Group

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > http://www-306. ibm.com/software /rational/ bios/ambler. html

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > ____________ _________ _________ _________ _________ __

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > Do You Yahoo!?

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > Tired of spam? Yahoo! Mail has the best spam protection around

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > > http://mail. yahoo.com

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > [Non-text portions of this message have been removed]

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > <!--

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > #ygrp-mlmsg {font-size:13px; font-family: arial,helvetica, clean,sans-

      >

      > > serif;}

      >

      > >

      >

      > > > #ygrp-mlmsg table {font-size:inherit; font:100% ;}

      >

      > >

      >

      > > > #ygrp-mlmsg select, input, textarea {font:99%

      >

      > >

      >

      > > > arial,helvetica, clean,sans- serif;}

      >

      > >

      >

      > > > #ygrp-mlmsg pre, code {font:115% monospace;}

      >

      > >

      >

      > > > #ygrp-mlmsg * {line-height: 1.22em;}

      >

      > >

      >

      > > > #ygrp-text{

      >

      > >

      >

      > > > font-family: Georgia;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-text p{

      >

      > >

      >

      > > > margin:0 0 1em 0;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-tpmsgs{

      >

      > >

      >

      > > > font-family: Arial;

      >

      > >

      >

      > > > clear:both;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-vitnav{

      >

      > >

      >

      > > > padding-top: 10px;

      >

      > >

      >

      > > > font-family: Verdana;

      >

      > >

      >

      > > > font-size:77% ;

      >

      > >

      >

      > > > margin:0;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-vitnav a{

      >

      > >

      >

      > > > padding:0 1px;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-actbar{

      >

      > >

      >

      > > > clear:both;

      >

      > >

      >

      > > > margin:25px 0;

      >

      > >

      >

      > > > white-space: nowrap;

      >

      > >

      >

      > > > color:#666;

      >

      > >

      >

      > > > text-align:right;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-actbar .left{

      >

      > >

      >

      > > > float:left;

      >

      > >

      >

      > > > white-space: nowrap;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > .bld{font-weight: bold;}

      >

      > >

      >

      > > > #ygrp-grft{

      >

      > >

      >

      > > > font-family: Verdana;

      >

      > >

      >

      > > > font-size:77% ;

      >

      > >

      >

      > > > padding:15px 0;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-ft{

      >

      > >

      >

      > > > font-family: verdana;

      >

      > >

      >

      > > > font-size:77% ;

      >

      > >

      >

      > > > border-top:1px solid #666;

      >

      > >

      >

      > > > padding:5px 0;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-mlmsg #logo{

      >

      > >

      >

      > > > padding-bottom: 10px;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > #ygrp-vital{

      >

      > >

      >

      > > > background-color: #e0ecee;

      >

      > >

      >

      > > > margin-bottom: 20px;

      >

      > >

      >

      > > > padding:2px 0 8px 8px;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-vital #vithd{

      >

      > >

      >

      > > > font-size:77% ;

      >

      > >

      >

      > > > font-family: Verdana;

      >

      > >

      >

      > > > font-weight: bold;

      >

      > >

      >

      > > > color:#333;

      >

      > >

      >

      > > > text-transform: uppercase;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-vital ul{

      >

      > >

      >

      > > > padding:0;

      >

      > >

      >

      > > > margin:2px 0;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-vital ul li{

      >

      > >

      >

      > > > list-style-type: none;

      >

      > >

      >

      > > > clear:both;

      >

      > >

      >

      > > > border:1px solid #e0ecee;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-vital ul li .ct{

      >

      > >

      >

      > > > font-weight: bold;

      >

      > >

      >

      > > > color:#ff7900;

      >

      > >

      >

      > > > float:right;

      >

      > >

      >

      > > > width:2em;

      >

      > >

      >

      > > > text-align:right;

      >

      > >

      >

      > > > padding-right: .5em;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-vital ul li .cat{

      >

      > >

      >

      > > > font-weight: bold;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-vital a {

      >

      > >

      >

      > > > text-decoration: none;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > #ygrp-vital a:hover{

      >

      > >

      >

      > > > text-decoration: underline;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > #ygrp-sponsor #hd{

      >

      > >

      >

      > > > color:#999;

      >

      > >

      >

      > > > font-size:77% ;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-sponsor #ov{

      >

      > >

      >

      > > > padding:6px 13px;

      >

      > >

      >

      > > > background-color: #e0ecee;

      >

      > >

      >

      > > > margin-bottom: 20px;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-sponsor #ov ul{

      >

      > >

      >

      > > > padding:0 0 0 8px;

      >

      > >

      >

      > > > margin:0;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-sponsor #ov li{

      >

      > >

      >

      > > > list-style-type: square;

      >

      > >

      >

      > > > padding:6px 0;

      >

      > >

      >

      > > > font-size:77% ;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-sponsor #ov li a{

      >

      > >

      >

      > > > text-decoration: none;

      >

      > >

      >

      > > > font-size:130% ;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-sponsor #nc {

      >

      > >

      >

      > > > background-color: #eee;

      >

      > >

      >

      > > > margin-bottom: 20px;

      >

      > >

      >

      > > > padding:0 8px;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-sponsor .ad{

      >

      > >

      >

      > > > padding:8px 0;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-sponsor .ad #hd1{

      >

      > >

      >

      > > > font-family: Arial;

      >

      > >

      >

      > > > font-weight: bold;

      >

      > >

      >

      > > > color:#628c2a;

      >

      > >

      >

      > > > font-size:100% ;

      >

      > >

      >

      > > > line-height: 122%;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-sponsor .ad a{

      >

      > >

      >

      > > > text-decoration: none;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-sponsor .ad a:hover{

      >

      > >

      >

      > > > text-decoration: underline;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-sponsor .ad p{

      >

      > >

      >

      > > > margin:0;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > o {font-size:0; }

      >

      > >

      >

      > > > .MsoNormal {

      >

      > >

      >

      > > > margin:0 0 0 0;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > #ygrp-text tt{

      >

      > >

      >

      > > > font-size:120% ;

      >

      > >

      >

      > > > }

      >

      > >

      >

      > > > blockquote{margin: 0 0 0 4px;}

      >

      > >

      >

      > > > .replbq {margin:4;}

      >

      > >

      >

      > > > -->

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > ____________ _________ _________ _________ _________ _________ _

      >

      > >

      >

      > > > Do you Yahoo!?

      >

      > >

      >

      > > > Everyone is raving about the all-new Yahoo! Mail beta.

      >

      > >

      >

      > > > http://new.mail. yahoo.com

      >

      > >

      >

      > > >

      >

      > >

      >

      > > > [Non-text portions of this message have been removed]

      >

      > >

      >

      > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > >

      >

      > >

      >

      > > [Non-text portions of this message have been removed]

      >

      > >

      >

      > > <!--

      >

      > >

      >

      > > #ygrp-mlmsg {font-size:13px; font-family: arial,helvetica, clean,sans-

      > serif;}

      >

      > > #ygrp-mlmsg table {font-size:inherit; font:100% ;}

      >

      > > #ygrp-mlmsg select, input, textarea {font:99%

      >

      > > arial,helvetica, clean,sans- serif;}

      >

      > > #ygrp-mlmsg pre, code {font:115% monospace;}

      >

      > > #ygrp-mlmsg * {line-height: 1.22em;}

      >

      > > #ygrp-text{

      >

      > > font-family: Georgia;

      >

      > > }

      >

      > > #ygrp-text p{

      >

      > > margin:0 0 1em 0;

      >

      > > }

      >

      > > #ygrp-tpmsgs{

      >

      > > font-family: Arial;

      >

      > > clear:both;

      >

      > > }

      >

      > > #ygrp-vitnav{

      >

      > > padding-top: 10px;

      >

      > > font-family: Verdana;

      >

      > > font-size:77% ;

      >

      > > margin:0;

      >

      > > }

      >

      > > #ygrp-vitnav a{

      >

      > > padding:0 1px;

      >

      > > }

      >

      > > #ygrp-actbar{

      >

      > > clear:both;

      >

      > > margin:25px 0;

      >

      > > white-space: nowrap;

      >

      > > color:#666;

      >

      > > text-align:right;

      >

      > > }

      >

      > > #ygrp-actbar .left{

      >

      > > float:left;

      >

      > > white-space: nowrap;

      >

      > > }

      >

      > > .bld{font-weight: bold;}

      >

      > > #ygrp-grft{

      >

      > > font-family: Verdana;

      >

      > > font-size:77% ;

      >

      > > padding:15px 0;

      >

      > > }

      >

      > > #ygrp-ft{

      >

      > > font-family: verdana;

      >

      > > font-size:77% ;

      >

      > > border-top:1px solid #666;

      >

      > > padding:5px 0;

      >

      > > }

      >

      > > #ygrp-mlmsg #logo{

      >

      > > padding-bottom: 10px;

      >

      > > }

      >

      > >

      >

      > > #ygrp-vital{

      >

      > > background-color: #e0ecee;

      >

      > > margin-bottom: 20px;

      >

      > > padding:2px 0 8px 8px;

      >

      > > }

      >

      > > #ygrp-vital #vithd{

      >

      > > font-size:77% ;

      >

      > > font-family: Verdana;

      >

      > > font-weight: bold;

      >

      > > color:#333;

      >

      > > text-transform: uppercase;

      >

      > > }

      >

      > > #ygrp-vital ul{

      >

      > > padding:0;

      >

      > > margin:2px 0;

      >

      > > }

      >

      > > #ygrp-vital ul li{

      >

      > > list-style-type: none;

      >

      > > clear:both;

      >

      > > border:1px solid #e0ecee;

      >

      > > }

      >

      > > #ygrp-vital ul li .ct{

      >

      > > font-weight: bold;

      >

      > > color:#ff7900;

      >

      > > float:right;

      >

      > > width:2em;

      >

      > > text-align:right;

      >

      > > padding-right: .5em;

      >

      > > }

      >

      > > #ygrp-vital ul li .cat{

      >

      > > font-weight: bold;

      >

      > > }

      >

      > > #ygrp-vital a {

      >

      > > text-decoration: none;

      >

      > > }

      >

      > >

      >

      > > #ygrp-vital a:hover{

      >

      > > text-decoration: underline;

      >

      > > }

      >

      > >

      >

      > > #ygrp-sponsor #hd{

      >

      > > color:#999;

      >

      > > font-size:77% ;

      >

      > > }

      >

      > > #ygrp-sponsor #ov{

      >

      > > padding:6px 13px;

      >

      > > background-color: #e0ecee;

      >

      > > margin-bottom: 20px;

      >

      > > }

      >

      > > #ygrp-sponsor #ov ul{

      >

      > > padding:0 0 0 8px;

      >

      > > margin:0;

      >

      > > }

      >

      > > #ygrp-sponsor #ov li{

      >

      > > list-style-type: square;

      >

      > > padding:6px 0;

      >

      > > font-size:77% ;

      >

      > > }

      >

      > > #ygrp-sponsor #ov li a{

      >

      > > text-decoration: none;

      >

      > > font-size:130% ;

      >

      > > }

      >

      > > #ygrp-sponsor #nc {

      >

      > > background-color: #eee;

      >

      > > margin-bottom: 20px;

      >

      > > padding:0 8px;

      >

      > > }

      >

      > > #ygrp-sponsor .ad{

      >

      > > padding:8px 0;

      >

      > > }

      >

      > > #ygrp-sponsor .ad #hd1{

      >

      > > font-family: Arial;

      >

      > > font-weight: bold;

      >

      > > color:#628c2a;

      >

      > > font-size:100% ;

      >

      > > line-height: 122%;

      >

      > > }

      >

      > > #ygrp-sponsor .ad a{

      >

      > > text-decoration: none;

      >

      > > }

      >

      > > #ygrp-sponsor .ad a:hover{

      >

      > > text-decoration: underline;

      >

      > > }

      >

      > > #ygrp-sponsor .ad p{

      >

      > > margin:0;

      >

      > > }

      >

      > > o {font-size:0; }

      >

      > > .MsoNormal {

      >

      > > margin:0 0 0 0;

      >

      > > }

      >

      > > #ygrp-text tt{

      >

      > > font-size:120% ;

      >

      > > }

      >

      > > blockquote{margin: 0 0 0 4px;}

      >

      > > .replbq {margin:4;}

      >

      > > -->

      >

      > >

      >

      > > ____________ _________ _________ _________ _________ _________ _

      >

      > > Do you Yahoo!?

      >

      > > Everyone is raving about the all-new Yahoo! Mail beta.

      >

      > > http://new.mail. yahoo.com

      >

      > >

      >

      > > [Non-text portions of this message have been removed]

      >

      > >

      >

      > >

      >

      > >

      >

      > [Non-text portions of this message have been removed]

      >

      > <!--

      >

      > #ygrp-mlmsg {font-size:13px; font-family: arial,helvetica, clean,sans- serif;}

      > #ygrp-mlmsg table {font-size:inherit; font:100% ;}

      > #ygrp-mlmsg select, input, textarea {font:99%

      > arial,helvetica, clean,sans- serif;}

      > #ygrp-mlmsg pre, code {font:115% monospace;}

      > #ygrp-mlmsg * {line-height: 1.22em;}

      > #ygrp-text{

      > font-family: Georgia;

      > }

      > #ygrp-text p{

      > margin:0 0 1em 0;

      > }

      > #ygrp-tpmsgs{

      > font-family: Arial;

      > clear:both;

      > }

      > #ygrp-vitnav{

      > padding-top: 10px;

      > font-family: Verdana;

      > font-size:77% ;

      > margin:0;

      > }

      > #ygrp-vitnav a{

      > padding:0 1px;

      > }

      > #ygrp-actbar{

      > clear:both;

      > margin:25px 0;

      > white-space: nowrap;

      > color:#666;

      > text-align:right;

      > }

      > #ygrp-actbar .left{

      > float:left;

      > white-space: nowrap;

      > }

      > .bld{font-weight: bold;}

      > #ygrp-grft{

      > font-family: Verdana;

      > font-size:77% ;

      > padding:15px 0;

      > }

      > #ygrp-ft{

      > font-family: verdana;

      > font-size:77% ;

      > border-top:1px solid #666;

      > padding:5px 0;

      > }

      > #ygrp-mlmsg #logo{

      > padding-bottom: 10px;

      > }

      >

      > #ygrp-vital{

      > background-color: #e0ecee;

      > margin-bottom: 20px;

      > padding:2px 0 8px 8px;

      > }

      > #ygrp-vital #vithd{

      > font-size:77% ;

      > font-family: Verdana;

      > font-weight: bold;

      > color:#333;

      > text-transform: uppercase;

      > }

      > #ygrp-vital ul{

      > padding:0;

      > margin:2px 0;

      > }

      > #ygrp-vital ul li{

      > list-style-type: none;

      > clear:both;

      > border:1px solid #e0ecee;

      > }

      > #ygrp-vital ul li .ct{

      > font-weight: bold;

      > color:#ff7900;

      > float:right;

      > width:2em;

      > text-align:right;

      > padding-right: .5em;

      > }

      > #ygrp-vital ul li .cat{

      > font-weight: bold;

      > }

      > #ygrp-vital a {

      > text-decoration: none;

      > }

      >

      > #ygrp-vital a:hover{

      > text-decoration: underline;

      > }

      >

      > #ygrp-sponsor #hd{

      > color:#999;

      > font-size:77% ;

      > }

      > #ygrp-sponsor #ov{

      > padding:6px 13px;

      > background-color: #e0ecee;

      > margin-bottom: 20px;

      > }

      > #ygrp-sponsor #ov ul{

      > padding:0 0 0 8px;

      > margin:0;

      > }

      > #ygrp-sponsor #ov li{

      > list-style-type: square;

      > padding:6px 0;

      > font-size:77% ;

      > }

      > #ygrp-sponsor #ov li a{

      > text-decoration: none;

      > font-size:130% ;

      > }

      > #ygrp-sponsor #nc {

      > background-color: #eee;

      > margin-bottom: 20px;

      > padding:0 8px;

      > }

      > #ygrp-sponsor .ad{

      > padding:8px 0;

      > }

      > #ygrp-sponsor .ad #hd1{

      > font-family: Arial;

      > font-weight: bold;

      > color:#628c2a;

      > font-size:100% ;

      > line-height: 122%;

      > }

      > #ygrp-sponsor .ad a{

      > text-decoration: none;

      > }

      > #ygrp-sponsor .ad a:hover{

      > text-decoration: underline;

      > }

      > #ygrp-sponsor .ad p{

      > margin:0;

      > }

      > o {font-size:0; }

      > .MsoNormal {

      > margin:0 0 0 0;

      > }

      > #ygrp-text tt{

      > font-size:120% ;

      > }

      > blockquote{margin: 0 0 0 4px;}

      > .replbq {margin:4;}

      > -->

      >

      > ____________ _________ _________ _________ _________ _________ _

      > Cheap talk?

      > Check out Yahoo! Messenger's low PC-to-Phone call rates.

      > http://voice. yahoo.com

      >

      > [Non-text portions of this message have been removed]

      >

      >

      >



      [Non-text portions of this message have been removed]














      <!--

      #ygrp-mlmsg {font-size:13px;font-family:arial,helvetica,clean,sans-serif;}
      #ygrp-mlmsg table {font-size:inherit;font:100%;}
      #ygrp-mlmsg select, input, textarea {font:99% arial,helvetica,clean,sans-serif;}
      #ygrp-mlmsg pre, code {font:115% monospace;}
      #ygrp-mlmsg * {line-height:1.22em;}
      #ygrp-text{
      font-family:Georgia;
      }
      #ygrp-text p{
      margin:0 0 1em 0;
      }
      #ygrp-tpmsgs{
      font-family:Arial;
      clear:both;
      }
      #ygrp-vitnav{
      padding-top:10px;
      font-family:Verdana;
      font-size:77%;
      margin:0;
      }
      #ygrp-vitnav a{
      padding:0 1px;
      }
      #ygrp-actbar{
      clear:both;
      margin:25px 0;
      white-space:nowrap;
      color:#666;
      text-align:right;
      }
      #ygrp-actbar .left{
      float:left;
      white-space:nowrap;
      }
      .bld{font-weight:bold;}
      #ygrp-grft{
      font-family:Verdana;
      font-size:77%;
      padding:15px 0;
      }
      #ygrp-ft{
      font-family:verdana;
      font-size:77%;
      border-top:1px solid #666;
      padding:5px 0;
      }
      #ygrp-mlmsg #logo{
      padding-bottom:10px;
      }

      #ygrp-vital{
      background-color:#e0ecee;
      margin-bottom:20px;
      padding:2px 0 8px 8px;
      }
      #ygrp-vital #vithd{
      font-size:77%;
      font-family:Verdana;
      font-weight:bold;
      color:#333;
      text-transform:uppercase;
      }
      #ygrp-vital ul{
      padding:0;
      margin:2px 0;
      }
      #ygrp-vital ul li{
      list-style-type:none;
      clear:both;
      border:1px solid #e0ecee;
      }
      #ygrp-vital ul li .ct{
      font-weight:bold;
      color:#ff7900;
      float:right;
      width:2em;
      text-align:right;
      padding-right:.5em;
      }
      #ygrp-vital ul li .cat{
      font-weight:bold;
      }
      #ygrp-vital a {
      text-decoration:none;
      }

      #ygrp-vital a:hover{
      text-decoration:underline;
      }

      #ygrp-sponsor #hd{
      color:#999;
      font-size:77%;
      }
      #ygrp-sponsor #ov{
      padding:6px 13px;
      background-color:#e0ecee;
      margin-bottom:20px;
      }
      #ygrp-sponsor #ov ul{
      padding:0 0 0 8px;
      margin:0;
      }
      #ygrp-sponsor #ov li{
      list-style-type:square;
      padding:6px 0;
      font-size:77%;
      }
      #ygrp-sponsor #ov li a{
      text-decoration:none;
      font-size:130%;
      }
      #ygrp-sponsor #nc {
      background-color:#eee;
      margin-bottom:20px;
      padding:0 8px;
      }
      #ygrp-sponsor .ad{
      padding:8px 0;
      }
      #ygrp-sponsor .ad #hd1{
      font-family:Arial;
      font-weight:bold;
      color:#628c2a;
      font-size:100%;
      line-height:122%;
      }
      #ygrp-sponsor .ad a{
      text-decoration:none;
      }
      #ygrp-sponsor .ad a:hover{
      text-decoration:underline;
      }
      #ygrp-sponsor .ad p{
      margin:0;
      }
      o {font-size:0;}
      .MsoNormal {
      margin:0 0 0 0;
      }
      #ygrp-text tt{
      font-size:120%;
      }
      blockquote{margin:0 0 0 4px;}
      .replbq {margin:4;}
      -->









      ____________________________________________________________________________________
      Want to start your own business?
      Learn how on Yahoo! Small Business.
      http://smallbusiness.yahoo.com/r-index

      [Non-text portions of this message have been removed]
    • Gerardo Bascianelli
      hi all, I think that a simple data object (like HashTable or similar) is useful in most cases. Business object make very strong coupling with data and object
      Message 2 of 23 , Dec 3, 2006
      • 0 Attachment
        hi all,

        I think that a simple data object (like HashTable or similar) is useful in
        most cases.
        Business object make very strong coupling with data and object model but -
        sometimes - is necessary to wrap data object with something smarter. Choice
        is hard and is up to the "sensibility" of the programmers.

        Gerri, Naples (italy).


        [Non-text portions of this message have been removed]
      Your message has been successfully submitted and would be delivered to recipients shortly.