键入的通用DAO和实体

时间:2011-10-04 09:37:37

标签: java generics dao

目前我正在尝试实施a typed generic DAO

我甚至没有编译任何东西,因为NetBeans抱怨UserDAOHibernate

  

此处预期界面
  type参数User不在类型变量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> {
}

LongEntityextend GenericEntity<Long>吗?如果是这样,我将如何使用Java的单级或继承?

这种分层方法是一个不好的例子吗?我的所有实体都需要一个id,这个实现可以很容易地在不同的id类型中重用,所以我想我可以使用它。

1 个答案:

答案 0 :(得分:1)

错误来自:

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

您已指定GenericHibernateDAO的{​​{1}}参数化类型受ID限制。

<ID extends Serializable>扩展了LongEntity,因此导致了类型不匹配的原因。

此外,GenericEntity是一个抽象类(而非接口),因此您需要GenericHibernateDAO而不是extends

正确的解决方案应该是:

implements