通用DAO为什么我们通用类型Id

时间:2014-07-10 08:16:07

标签: java hibernate generics dao

我确实看了很多DAO的例子,而且我确实"总是"看到这些通用DAO总是具有从Serializable扩展的泛型类型ID。但这种类型从未在课堂上使用过?那么这背后的背景是什么,或者它仍然是从教程到教程的复制/粘贴问题?希望得到一些回应,thx

使用java和hibernate的DAO的通用实现: Hibernate generic DAO, Generic Service, and Generic View Layer?

3 个答案:

答案 0 :(得分:2)

我几乎从未在我的通用DAO中使用通用类型ID。使用

完全没问题
public abstract GenericDao<T> {
    /**
     * Method that returns the number of entries from a table that meet some
     * criteria (where clause params)
     *
     * @param params
     *            sql parameters
     * @return the number of records meeting the criteria
     */
    long countAll(Map<String, Object> params);

    T create(T t);

    void delete(Object id);

    T find(Object id);

    T update(T t);   
}

但在这种情况下,定义主ID而不是长ID是实践:

public abstract GenericDAO<T, PK implements Serializable>

请在此处阅读详细信息Don't repeat the DAO

答案 1 :(得分:1)

Id类型应该在find()(或任何其他接受id的方法)的声明中使用:

public abstract class GenericDao<E, ID extends Serializable> {
   ...
   public E find(ID id) { ... }
   ...
}

答案 2 :(得分:0)

我可能只是翻译Hibernate API的情况。

有些函数使用可序列化的ID。程序员可能认为没有必要限制它的通用DAO的潜力。请参阅示例getload方法。它们具有相同的可序列化ID:

Object load(Class theClass,
            Serializable id)
            throws HibernateException

但是,正如其他人所说,你可以自由地使用类似Long的固定类型作为你的ID。至少如果您确定不打算将String用作主键。 (例如:一个国家/地区可以将ISO代码作为其主键)。