I'm using the GenericDao approach discussed provided by appfuse.

I have a DAO that is used to persist/get ElectronicFormsConfirmationDetails
objects, where ElectronicFormsConfirmationDetails extends
ConfirmationDetails:

public class ElectronicFormsConfirmationDetails extends ConfirmationDetails
{

        private DocumentDeliveryPreferences documentDeliveryPreferences;

        ...
}
public class ConfirmationDetails extends IDObject {

        private TaxEntity taxEntity;
        private Confirmation confirmation;
        private ElectionEvent electionEvent;
        private ActiveStatus activeStatus;
        private ConfirmationType confirmationType;

        ...
}

public interface ElectronicFormsConfirmationDetailsDao extends
                GenericDao<ElectronicFormsConfirmationDetails, Long> {

        public ElectronicFormsConfirmationDetails findCurrentElection(
                        TaxEntity taxEntity);

}


Now I'm going to have additional ConfirmationDetails types that will extend
ConfirmationDetails, for instance:

public class ServiceProviderConfirmationDetails extends ConfirmationDetails
{

        private AccessType accessType;
        private ServiceProvider serviceProvider;
        private boolean participating;

        ...
}

And its associated DAO will have many shared methods (but will certainly
have some that are unique to ServiceProviderConfirmationDetails):

public interface ServiceProviderConfirmationDetailsDao extends
                GenericDao<ServiceProviderConfirmationDetails, Long> {

        public ServiceProviderConfirmationDetails findCurrentElection(
                        TaxEntity taxEntity);

}

I'm finding that I'm generating a great deal of similar code due to this
scenario, so I was thinking of creating a ConfirmationDetailsDao, having it
extend GenericDao and having the ServiceProviderConfirmationDetailsDao and
ElectronicFormsConfirmationDetailsDao extend that:


public interface ConfirmationDetailsDao extends
                GenericDao<ConfirmationDetails, Long> {

        public ConfirmationDetails findCurrentElection(
                        TaxEntity taxEntity);

}

public interface ElectronicFormsConfirmationDetailsDao extends
                ConfirmationDetailsDao {
        //Nothing yet
}

public interface ServiceProviderConfirmationDetailsDao extends
                ConfirmationDetailsDao {
        //Nothing yet
}


This way, using Hibernate's polymorphism support, I would think I wouldn't
need to write specific findCurrentElection methods for each
ConfirmationDetails DAO type.

However, I'm not sure this approach is going to work.  For instance, if I
try to retrieve a ElectronicFormsConfirmationDetails object, using my
ElectronicFormsConfirmationDetailsDao:

ElectronicFormsConfirmationDetails confirmationDetails =
electronicFormsConfirmationDetailsDao
                                .findCurrentElection(taxEntity);

I receive the following compile-time error: "Type mismatch: cannot convert
from ConfirmationDetails to ElectronicFormsConfirmationDetails"

This makes sense, obviously, as my method signature for my
ElectronicFormsConfirmationDetailsDao, returns a ConfirmationDetails object
as it is declared in the ConfirmationDetailsDao object.  I can cast the
object and the code works:

ElectronicFormsConfirmationDetails confirmationDetails =
(ElectronicFormsConfirmationDetails) electronicFormsConfirmationDetailsDao
                                .findCurrentElection(taxEntity);

But it feels like a clunky solution to the problem.  How can the client know
for sure that the returned ConfirmationDetails object is a
ElectronicFormsConfirmationDetails subclass?

Does anyone have any suggestions on my approach?  Is there a better way I
can cut down on the redundancy in my DAO code, while not requiring the
client to cast calls?


Thanks for your help!
Leo

-- 
View this message in context: 
http://www.nabble.com/GenericDao-and-Class-Hierarchy---Approach--tp14672300s2369p14672300.html
Sent from the AppFuse - User mailing list archive at Nabble.com.

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

Reply via email to