两个类里面的代码几乎重复

发布于 2024-12-28 22:54:12 字数 1467 浏览 5 评论 0原文

目前,我有两个类: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);

    }
}

我看到这两个类包含几乎相同的方法和方法实现。

我想,这不太好。 你觉得怎么样?或者这是正常的?

At this moment, I have two classes: UserHibernateDao and 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));
    }
}

and second:

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

    }
}

I see that both classes contain almost equal methods and method implementations.

I think, it is not very good. What do you think? Or it is normal?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

我的鱼塘能养鲲 2025-01-04 22:54:12

像这样的东西应该适合你,它通常被称为“通用 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);
    }
}

Something like this should work for you, it's generally called the "Generic DAO Pattern".

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

and then:

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

and

public class UserDaoHibernate extends BaseDaoHibernate<User> {
    public UserDaoHibernate() {
        super(User.class);
    }
}
冷月断魂刀 2025-01-04 22:54:12

使用泛型并阅读文档。太棒了。

Use Generics and read this document. It's excellent.

蓝天白云 2025-01-04 22:54:12

将以下有用的方法添加到 public abstract Dao 中:

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中; 并重写为:

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

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

Add the following useful method to 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;
}

Then your get and remove methods can be moved to Dao<T> and rewritten as:

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

public void remove(long id) {
    getHibernateTemplate().delete(get(id));
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文