Thanks for your reply Mike! I had a feeling Generics were going to save the
day. So now my interfaces are working easily enough, but I have trouble
once I get to my implementation:
public class HibernateConfirmationDetailsDao<T extends ConfirmationDetails>
extends
HibernateGenericDao<T, Long> implements
ConfirmationDetailsDao<T> {
public HibernateConfirmationDetailsDao() {
super(ConfirmationDetails.class);
}
...
}
The super(ConfirmationDetails.class); line errors, stating: "The constructor
HibernateGenericDao<T,Long>(Class<ConfirmationDetails>) is undefined". I'm
guessing I need something like: super(T.class) but T.class is not valid.
Any idea on how to express this?
Thanks again!
Mike Horwitz wrote:
>
> On Jan 7, 2008 6:11 PM, leojhartiv <[EMAIL PROTECTED]> wrote:
>
>>
>> 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?
>
>
> The simplest solution would probably be to use generics as per the
> GenericDao. So instead of
>
> public interface ConfirmationDetailsDao extends
> GenericDao<ConfirmationDetails, Long>
>
> Do something like
>
> public interface ConfirmationDetailsDao<T extends ConfirmationDetails>
> extends GenericDao<T, Long>
>
> Mike
>
>>
>>
>>
>> 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]
>>
>>
>
>
--
View this message in context:
http://www.nabble.com/GenericDao-and-Class-Hierarchy---Approach--tp14672300s2369p14676912.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]