Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Hibernate DAO命名约定?_Java_Hibernate_Spring_Dao - Fatal编程技术网

Java Spring Hibernate DAO命名约定?

Java Spring Hibernate DAO命名约定?,java,hibernate,spring,dao,Java,Hibernate,Spring,Dao,用以下方式命名DAO是否很典型: UserDAO - interface UserDAOImpl - implements UserDAO 我想知道它的标准是在实现中使用后缀“Impl”,还是使用更有意义的后缀是最佳实践。谢谢。首先,您可能不需要为每个类都使用DAO类。本文解释了什么是泛型DAO。想知道如何命名样板代码是没有成效的 现在,当您有一个通用DAO时,您可以选择: DAO(接口) SessionDAO和EntityManagerDAO-用于使用Session或EntityManag

用以下方式命名DAO是否很典型:

UserDAO - interface
UserDAOImpl - implements UserDAO

我想知道它的标准是在实现中使用后缀“Impl”,还是使用更有意义的后缀是最佳实践。谢谢。

首先,您可能不需要为每个类都使用DAO类。本文解释了什么是泛型DAO。想知道如何命名样板代码是没有成效的

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

  • DAO
    (接口)
  • SessionDAO
    EntityManagerDAO
    -用于使用
    Session
    EntityManager
当然,DAO只能通过接口使用。您可以轻松地在实现之间切换


(实际上,我更喜欢小写的--
Dao
,尽管它是一个缩写;而
Impl
后缀)通常是我使用的。有时,如果您正在创建一个期望其他人实现的接口,而您正在提供参考实现,那么像
DefaultUserDAO
这样的默认前缀可能更有意义


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

我看到了两种方法:

  • 接口为FooDao,实现为FooDaoImpl
  • 接口使用IFooDao,实现使用FooDao
  • 前者根源于CORBA;后者是Microsoft COM/.NET约定。(感谢帕斯卡的纠正。)

    “不要重复道”是个好主意。我个人认为这篇文章比它需要的更复杂。有一种方法可以做到这一点,而不需要在发现者身上进行反思,而我恰好更喜欢这种方法。如果您使用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);
    }
    
    包持久化;
    导入java.io.Serializable;
    导入java.util.List;
    公共接口通用DAO
    {
    T-find(K-id);
    列表查找();
    列表查找(T示例);
    列表查找(字符串queryName、字符串[]参数名、对象[]bindValues);
    K保存(T实例);
    void更新(T实例);
    无效删除(T实例);
    }
    
    我也是GenericDao和GenericDaoImpl-约定的粉丝,如果保存或删除需要对某些持久性类执行额外操作,则GenericHelper类会提供一些支持:

    public interface PersistListener<T> {
       void onPersist(T item);
    }
    
    公共接口持久化侦听器{
    无效(T项);
    }
    
    类似的构造也可用于删除。如果您需要某种类型的事件日志来写入每个活动,并且不想使用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 );
      }
    
      // ...
    }
    
    public类GenericDaoImpl扩展了HibernateTemplate{
    public void setpersisteners侦听器(列出侦听器){
    this.persistListeners=新的GenericInterfaceHandler(侦听器,
    persistener.class);
    }
    //hibernate更新对象本身的键
    公共T保存(T项){
    getSession()。保存(项);
    List listeners=this.persisteners.getAll(项);
    for(持久侦听器:侦听器)
    listener.persist(项);
    }
    // ...
    }
    
    上面示例中的persistListener将要做的是找到一个persistListener,它的泛型类与作为参数给定的类的泛型类匹配。如果找到这样的调用,则将调用委派给适当的侦听器。我的GenericInterfaceHandler还可以用于仅返回最特定的处理程序,或者仅返回给定类的处理程序(如果存在)


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

    谢谢!另外,将我的DAO接口放在DAO包中,将实现放在DAO.hibernate包中(以便以后可以交换实现)是否有意义?吹毛求疵:后者是Microsoft COM约定。感谢您的更正,Pascal。我是微软所有东西的后来者,所以直到最近我才通过C#意识到这一点。