Java Spring Hibernate DAO命名约定?
用以下方式命名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
UserDAO - interface
UserDAOImpl - implements UserDAO
我想知道它的标准是在实现中使用后缀“Impl”,还是使用更有意义的后缀是最佳实践。谢谢。首先,您可能不需要为每个类都使用DAO类。本文解释了什么是泛型DAO。想知道如何命名样板代码是没有成效的 现在,当您有一个通用DAO时,您可以选择:
(接口)DAO
和SessionDAO
-用于使用EntityManagerDAO
或Session
EntityManager
(实际上,我更喜欢小写的--
Dao
,尽管它是一个缩写;而Impl
后缀)通常是我使用的。有时,如果您正在创建一个期望其他人实现的接口,而您正在提供参考实现,那么像DefaultUserDAO
这样的默认前缀可能更有意义
大多数时候,我觉得这两种方法可以互换使用,但在某些情况下,一种方法比另一种方法更清晰。我看到了两种方法:
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#意识到这一点。