【问题标题】:Spring-Hibernate DAO naming convention?Spring-Hibernate DAO 命名约定?
【发布时间】:2011-01-11 12:37:16
【问题描述】:

通常以以下方式命名 DAO:

UserDAO - interface
UserDAOImpl - implements UserDAO

我想知道它的标准是否使用后缀“Impl”来实现,或者更有意义的东西是否是最佳实践。谢谢。

【问题讨论】:

    标签: java hibernate spring dao


    【解决方案1】:

    这通常是我使用的。有时,如果您正在创建一个您希望其他人实现但您提供参考实现的接口,则像 DefaultUserDAO 这样的 Default 前缀可能更有意义。

    大多数时候我觉得这两个可以互换使用,但在某些情况下,一个比另一个更清晰。

    【讨论】:

    • 谢谢!另外,将我的 DAO 接口放在 dao 包中并将实现放在 dao.hibernate 包中是否有意义(以便以后可以交换实现)?
    【解决方案2】:

    我见过两种约定:

    1. FooDao 用于接口,FooDaoImpl 用于实现
    2. IFooDao 用于接口,FooDao 用于实现

    前者起源于 CORBA;后者是 Microsoft COM/.NET 约定。 (感谢 Pascal 的更正。)

    “不要重复 DAO”是个好主意。我个人认为这篇文章比它需要的更复杂。有一种方法可以做到这一点,而无需在我碰巧喜欢的查找器中进行反思。如果您使用 Hibernate,则通过示例查询可能是一种简单的好方法。界面看起来更像这样:

    package persistence;
    
    import java.io.Serializable;
    import java.util.List;
    
    public interface GenericDao<T, K extends Serializable>
    {
       T find(K id);
       List<T> find();
       List<T> find(T example);
       List<T> find(String queryName, String [] paramNames, Object [] bindValues);
    
       K save(T instance);
       void update(T instance);
       void delete(T instance);
    }
    

    【讨论】:

    • Nitpick:后者是 Microsoft COM 约定。
    • 感谢帕斯卡的更正。我是微软所有事情的后来者,所以我最近才通过 C# 意识到它。
    【解决方案3】:

    首先 - 您可能并不真的需要为每个类创建一个 DAO 类。 Don't repeat the DAO! 文章解释了什么是通用 DAO。想知道如何命名样板代码是没有效率的。

    现在,当您拥有通用 DAO 时,您可以选择:

    • DAO(接口)
    • SessionDAOEntityManagerDAO - 用于使用 SessionEntityManager

    当然,只能通过接口使用 DAO。您可以轻松地在实现之间切换。

    (我实际上更喜欢它小写 - Dao,虽然它是一个缩写;还有 Impl 后缀)

    【讨论】:

      【解决方案4】:

      我也是 GenericDao 和 GenericDaoImpl -convention 的粉丝,如果保存或删除需要对某些持久类执行额外操作,则需要通用帮助类的一些支持:

      public interface PersistListener<T> {
         void onPersist(T item);
      }
      

      类似的结构也可用于删除。如果您需要某种事件日志来写入每个活动并且您不想为此使用 AOP,这将特别有用。

      我的 GenericDaoImpl 看起来像这样:

      public class GenericDaoImpl<T> extends HibernateTemplate {
        public void setPersistListeners(List<PersistListener> listeners) {
           this.persistListeners = new GenericInterfaceHandler( listeners, 
              PersistListener.class );
        }
      
        // hibernate updates the key to the object itself
        public T save(T item) {
           getSession().save( item );
           List<PersistListener<T>> listeners = this.persistListeners.getAll( item );
           for ( PersistListener<T> listener : listeners )
              listener.persist( item );
        }
      
        // ...
      }
      

      上面示例中的persistListener 将做的是找到一个PersistListener,其泛型类与作为参数给出的类匹配。找到它,然后将调用委托给适当的侦听器。我的 GenericInterfaceHandler 也可用于仅返回最特定的处理程序或仅返回给定类的处理程序(如果存在)。

      如果您有兴趣,我还可以发布 GenericInterfaceHandler 实现,因为它在很多情况下都是非常强大的构造。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-25
        • 2013-10-17
        • 2011-01-27
        • 2010-12-07
        • 1970-01-01
        • 2011-05-06
        • 2012-02-14
        • 2018-01-10
        相关资源
        最近更新 更多