【发布时间】:2017-08-27 03:19:06
【问题描述】:
我正在使用 Jersey 和 Hibernate 以及 Postgres 作为后端开发 REST Web 服务。我有 3 个用于模型、资源和服务的包。对于服务中的每种方法,我都在复制代码:
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
***SOME UNIQUE OBJECT*** = (***SOME UNIQUE OBJECT TYPE***) session.save(***SOME UNIQUE OBJECT***);
session.getTransaction().commit();
} catch (HibernateException e) {
if (transaction != null) {
transaction.rollback();
}
} finally {
session.close();
}
return ***SOME UNIQUE OBJECT***;
有人可以建议我如何在不复制此代码的情况下做到这一点。我正在考虑为实体模型类编写一个接口。然后将该接口传递给上面的代码。不确定这是否是最好的方法。
【问题讨论】:
-
使用 DAO 设计模式。所有持久性方法和数据库交互都应该只通过您的数据访问类发生。您的服务类应该调用数据访问类的方法。只有数据访问对象应该调用像 session.save() 这样的持久化方法 在 DAO 类中创建一个方法,并且可以从不同的服务类中多次引用它。还要使您的所有服务类方法(那些通过 DAO 类持久化)具有事务性。在方法签名之上使用@transactional。
-
@RahulRaj 你能展示一个例子或包含一些资源的链接吗?我找到了这个tutorialspoint.com/design_pattern/…。
-
可以
Generic Types解决你的问题。只需将此块提取为save方法即可。 -
对 DAO 类使用
@Repository注解,对所有持久化的服务类方法使用@Transactional。 -
@RahulRaj 如果你能举个例子会很有帮助。
标签: java hibernate design-patterns