Два класса с почти дублированным кодом внутри - PullRequest
4 голосов
/ 25 января 2012

На данный момент у меня есть два класса: UserHibernateDao и TicketHibernateDao:

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);

    }
}

Я вижу, что оба класса содержат почти одинаковые методы и реализации методов.

Я думаю, это не очень хорошо. Как вы думаете? Или это нормально?

Ответы [ 3 ]

6 голосов
/ 25 января 2012

Что-то вроде этого должно работать для вас, это обычно называется "Общий шаблон 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 голосов
/ 25 января 2012

Используйте Generics и прочитайте этот документ. Это отлично.

1 голос
/ 25 января 2012

Добавьте следующий полезный метод к 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;
}

Затем ваши get и remove методы могут быть перемещены в Dao<T> и переписаны как:

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

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