【问题标题】:How do i reduce bioler plate code in my hibernate based dao implementation如何在基于休眠的 dao 实现中减少样板代码
【发布时间】:2019-03-07 15:08:18
【问题描述】:

我为我的一个 dao 接口编写了一个基于休眠的实现,但现在我意识到有很多重复的代码,比如打开 sesison、开始运行、提交和回滚,每个方法都有相同的代码,我想知道如何将它保存在一个地方,我听说过一个叫做 AbstractDao 的东西,但是这个概念如何适合这里,它真的有效吗,我想减少样板代码。

这是我的实现类的sn-p

package com.javarnd.cip.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.javarnd.cip.db.HibernateUtil;
import com.javarnd.cip.model.Sports;

public class SportsDaoImpl implements SportsDao {

    public void save(Sports sports) {
        Session session = HibernateUtil.openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            session.save(sports);
            session.getTransaction().commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            e.printStackTrace();
        } finally {
            session.close();
        }

    }

    public List<Sports> findAll() {
        Session session = HibernateUtil.openSession();
        Transaction tx = null;
        List<Sports> sportsList = new ArrayList<>();
        try {
            tx = session.beginTransaction();
            sportsList = session.createQuery("FROM Sports", Sports.class).list();
            session.getTransaction().commit();

        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
                return null;
            }
            e.printStackTrace();
        } finally {
            session.close();
        }
        return sportsList;

    }

    public void update(Sports sports) {
        Session session = HibernateUtil.openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();

            Sports sportsData = session.get(Sports.class, sports.getSportId());
            sportsData.setName(sports.getName());
            session.getTransaction().commit();

        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            e.printStackTrace();
        } finally {
            session.close();
        }
    }

    public void delete(Sports sports) {
        Session session = HibernateUtil.openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();

            Sports sportsData = session.get(Sports.class, sports.getSportId());
            session.delete(sportsData);

            session.getTransaction().commit();

        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            e.printStackTrace();
        } finally {
            session.close();
        }
    }

    @Override
    public Sports findById(long sportsId) {
        Session session = HibernateUtil.openSession();
        Transaction tx = null;
        Sports sportsData = null;
        try {
            tx = session.beginTransaction();
            sportsData = session.get(Sports.class, sportsId);
            session.getTransaction().commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            e.printStackTrace();
        } finally {
            session.close();
        }
        return sportsData;
    }

}

【问题讨论】:

  • 你可以使用spring-data-jpa和JpaRepository
  • 我没有使用 Spring 框架。
  • 我正在寻找某种 util 类,它可以在其中放置所有这些代码行,并且我可以扩展或调用相同的方法,欢迎任何建议

标签: java hibernate


【解决方案1】:

如果你可以使用 java 8,它可能是这样的:

private static <OUTPUT> OUTPUT runInTransaction(Function<Session, OUTPUT> function) {
    Transaction tx = null;
    try (Session session = HibernateUtil.openSession()) {
        tx = session.beginTransaction();
        final OUTPUT result = function.apply(session);
        session.getTransaction().commit();
        return result;
    } catch (Exception e) {
        if (tx != null) {
            tx.rollback();
        }
        e.printStackTrace();
        return null;
    }
}

然后:

runInTransaction(session -> {
    return session.get(Sports.class, sportsId);
});

【讨论】:

  • 我如何获得相应的类型,如运动列表、运动对象和 void too
  • 已编辑。 Generic OUTPUT 代表你的输出,所以你可以返回任何你想要的东西。对于 void 只返回 null 而 OUTPUT 将只是 Object
  • ohkk 非常感谢,我会实施同样的方法并观察效果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
相关资源
最近更新 更多