Типизированный универсальный DAO и Entity - PullRequest
0 голосов
/ 04 октября 2011

в настоящее время я пытаюсь реализовать типизированный универсальный DAO .

Я даже не могу ничего скомпилировать, поскольку NetBeans жалуется на UserDAOHibernate

интерфейс ожидается здесь
аргумент типа Пользователь находится за пределами переменной типа ENTITY

Боюсь, что в использовании наследования / интерфейсов есть какая-то очевидная ошибка, поскольку я довольно новичок в Java.

Вот какой-то урезанный код

public interface GenericEntity<ID extends Serializable> {
    public abstract ID getId();
    public abstract void setId(final ID id);
}

public abstract class LongEntity implements GenericEntity<Long> {
    protected Long id;
    public Long getId();
    public void setId(final Long id);
}

public class User extends LongEntity implements Serializable {
    private String name;
    private String password;
    private Customer customer;
}

public interface GenericDAO<ENTITY extends GenericEntity<ID>, ID extends Serializable> {
    public abstract ENTITY findById(ID id);
    public abstract List<ENTITY> findAll();
    public abstract ENTITY makePersistent(ENTITY entity);
    public abstract void makeTransient(ENTITY entity);
}

public abstract class GenericHibernateDAO<ENTITY extends GenericEntity<ID>, ID extends Serializable>
        implements GenericDAO<ENTITY, ID> {
}

public class UserDAOHibernate implements GenericHibernateDAO<User, LongEntity> {
}

Это то, что LongEntity должно extend GenericEntity<Long>? Если так, как бы я сделал это с единственным уровнем Java или наследованием?

Является ли этот многоуровневый подход плохим примером для подражания? Все мои сущности нуждаются в идентификаторе, и эта реализация может быть легко использована позже с разными типами идентификаторов, поэтому я подумал, что мог бы использовать его.

1 Ответ

1 голос
/ 04 октября 2011

Ошибка происходит отсюда:

public class UserDAOHibernate implements GenericHibernateDAO<User, LongEntity> {
}

Вы указали, что параметризованный тип GenericHibernateDAO ID ограничен <ID extends Serializable>.

LongEntity extendsGenericEntity, и, следовательно, почему у вас несоответствие типов.

Кроме того, GenericHibernateDAO является абстрактным классом (а не интерфейсом), поэтому вам нужно будет extends вместо implements.

Правильное решение должно быть:

public class UserDAOHibernate extends GenericHibernateDAO<User, Long> {
}
...