2012-01-25 110 views
4

在這一刻,我有兩個類:UserHibernateDaoTicketHibernateDao兩類幾乎重複的代碼裏面

import java.util.List; 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 

import model.dao.Dao; 
import model.entity.User; 

public class UserDaoHibernate extends HibernateDaoSupport implements Dao<User> { 

    public User get(long id) { 
     return getHibernateTemplate().get(User.class, id); 
    } 

    public void save(User user) { 
     getHibernateTemplate().save(user); 

    } 

    public void remove(long id) { 
     getHibernateTemplate().delete(
       getHibernateTemplate().get(User.class, id)); 
    } 
} 

和第二:

import java.util.List; 

import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 

import model.dao.Dao; 
import model.entity.Ticket; 

public class TicketDaoHibernate extends HibernateDaoSupport implements 
     Dao<Ticket> { 

    public Ticket get(long id) { 

     return getHibernateTemplate().get(Ticket.class, id); 

    } 

    public void save(Ticket ticket) { 
     getHibernateTemplate().save(ticket); 
    } 

    public void remove(long id) { 

     getHibernateTemplate().delete(
       getHibernateTemplate().get(Ticket.class, id)); 

    } 

    public void save(Ticket ticket) { 

     getHibernateTemplate().saveOrUpdate(ticket); 

    } 
} 

我看到兩個類都包含幾乎相等的方法和方法實現。

我想,這不是很好。 你覺得呢?或者這是正常的?

+0

模板,也許? – m0skit0

+1

閱讀[Java Generics](http://en.wikipedia.org/wiki/Generics_in_Java) –

+0

在第二個代碼示例中是否應該有2個'public void save(Ticket ticket)'? – Sign

回答

6

像這樣的東西應該適合你,它通常被稱爲「通用DAO模式」。

public abstract class BaseDaoHibernate<T> extends HibernateDaoSupport implements Dao<T> { 

    private final Class<T> entityType; 

    protected BaseDaoHibernate(Class<T> entityType) { 
     this.entityType = entityType; 
    } 

    public T get(long id) { 
     return getHibernateTemplate().get(entityType, id); 
    } 

    public void save(T entity) { 
     getHibernateTemplate().save(entity); 
    } 

    public void remove(long id) { 
     getHibernateTemplate().delete(get(id)); 
    } 
} 

然後:

public class TicketDaoHibernate extends BaseDaoHibernate<Ticket> { 
    public TicketDaoHibernate() { 
     super(Ticket.class); 
    } 
} 

public class UserDaoHibernate extends BaseDaoHibernate<User> { 
    public UserDaoHibernate() { 
     super(User.class); 
    } 
} 
3

使用泛型並閱讀this文檔。非常好。

1

添加以下有用的方法來public abstract Dao<T>

public Class<E> getEntityClass() { 
    if (entityClass == null) { 
     Type type = getClass().getGenericSuperclass(); 
     if (type instanceof ParameterizedType) { 
      ParameterizedType paramType = (ParameterizedType) type; 
      entityClass = (Class<E>) paramType.getActualTypeArguments()[0]; 
     } else 
      throw new IllegalArgumentException("Could not guess entity class"); 
    } 
    return entityClass; 
} 

然後你getremove種方法可以移動到Dao<T>和改寫爲:

public T get(long id) { 
    return getHibernateTemplate().get(getEntityClass(), id); 
} 

public void remove(long id) { 
    getHibernateTemplate().delete(get(id)); 
}