java - 如何在基于休眠的 dao 实现中减少 bioler 板代码
问题描述
我为我的一个 dao 接口编写了一个基于休眠的实现,但现在我意识到有很多重复的代码,比如打开 sesison、开始运行、提交和回滚,每个方法都有相同的代码,我想知道如何将它保存在一个地方,我听说过一个叫做 AbstractDao 的东西,但是这个概念如何适合这里,它真的有效吗,我想减少样板代码。
这是我的实现类片段
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;
}
}
解决方案
如果你可以使用 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);
});
推荐阅读
- sql - 如何将oracle查询中的行乘以计数列?
- prestashop - 如何在 prestashop 1.7 中显示我的管理选项卡?
- python - 如何找到私有 IP 地址的位置?
- javascript - 输入几何不是 turf.js 中的有效多边形
- apache-kafka - 我们可以为基于后缀(后缀)的消费者组授予 Kafka ACL
- python - 树莓派风扇控制 pwm intel
- java - 如何让 TextView 打印来自 EditText 的值?
- python - 具有复杂小部件表示的模型/视图 QListView
- hibernate - Quarkus (2.0.1), Hibernate Panache Reactive , Gradle 7.0.2, 6.8.3 在快速启动 hibernate-reactive-panache-quickstart 上测试失败
- html - Django Forms vs HTML - 按钮的名称值/使用动态数据