Hibernate-交易样板代码 [英] Hibernate - Boilerplate code for transactions

查看:113
本文介绍了Hibernate-交易样板代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经为数据库CRUD操作编写了此服务类。

I have written this service class for database CRUD operations.

可见的公共类CompanyServiceImpl扩展了PersistentRemoteService实现CompanyService {

visible public class CompanyServiceImpl extends PersistentRemoteService implements CompanyService {

    private GileadHibernateUtil gileadHibernateUtil;

    public CompanyServiceImpl() {
        gileadHibernateUtil = new GileadHibernateUtil();
        setBeanManager(gileadHibernateUtil.getPersistentBeanManager());
    }

    @Override
    public void addCompany(Company newCompany) {
        Objects.requireNonNull(newCompany, "newCompany is null.");

        Session session = gileadHibernateUtil.getCurrentSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.persist(newCompany);
            session.getTransaction().commit();
        } finally {
            if (transaction.isActive()) {
                transaction.rollback();
            }
            session.close();
        }
    }

    @Override
    public Company updateCompany(Company company) {
        Objects.requireNonNull(company, "company is null.");

        Session session = gileadHibernateUtil.getCurrentSession();
        Transaction transaction = null;
        Company managedCompany = null;

        try {
            transaction = session.beginTransaction();
            managedCompany = (Company) session.merge(company);
            session.getTransaction().commit();
        } finally {
            if (transaction.isActive()) {
                transaction.rollback();
            }
        }

        return managedCompany;
    }

    @Override
    public void deleteCompany(Company company) {
        Objects.requireNonNull(company, "company is null.");

        Session session = gileadHibernateUtil.getCurrentSession();
        Transaction transaction = null;

        try {
            transaction = session.beginTransaction();
            session.delete(company);
            session.getTransaction().commit();
        } finally {
            if (transaction.isActive()) {
                transaction.rollback();
            }
        }

    }

    @Override
    public Company findCompany(int companyId) {
        if (companyId <= 0) {
            throw new IllegalArgumentException("companyId must be a positive integer.");
        }

        Session session = gileadHibernateUtil.getCurrentSession();
        Transaction transaction = null;
        Company company = null;

        try {
            transaction = session.beginTransaction();
            company = (Company) session.get(Company.class, companyId);
            session.getTransaction().commit();
        } finally {
            if (transaction.isActive()) {
                transaction.rollback();
            }
        }
        return company;
    }

    @Override
    public List<Company> findMatchingCompanies(String companyName) {

        Session session = gileadHibernateUtil.getCurrentSession();
        Transaction transaction = null;
        List<Company> matchingCompanies = null;

        try {
            transaction = session.beginTransaction();
            Criteria searchCriteria = session.createCriteria(Company.class).add(
                    Restrictions.or(Restrictions.like("code", companyName), Restrictions.like("name", companyName)));
            session.getTransaction().commit();

            matchingCompanies = searchCriteria.list();
        } finally {
            if (transaction.isActive()) {
                transaction.rollback();
            }
        }

        return matchingCompanies;
    }

    @Override
    public List<Company> findAllCompanies() {

        Session session = gileadHibernateUtil.getCurrentSession();
        Transaction transaction = null;
        List<Company> companies = null;

        try {
            transaction = session.beginTransaction();
            Criteria searchCriteria = session.createCriteria(Company.class);
            session.getTransaction().commit();

            companies = searchCriteria.list();
        } finally {
            if (transaction.isActive()) {
                transaction.rollback();
            }
        }
        return companies;
    }

}

我决定不单独使用DAO层。它是一个小应用程序,我不会从Hibernate切换到。它所包含的只是Hibernate会话命令。事务的开始和结束仍然在业务层。因此,Hibernate几乎可以作为我的DAO层。
困扰我的是看似交易的样板代码,它必须用每种CRUD方法编写。
这是更好的方法吗?或者这是无论如何都要重复的最少代码量?

I decided to not use a separate DAO layer. Its a small app and I am not going to switch from Hibernate. All it would have included was Hibernate session commands. Beginning and ending a transaction still comes in business layer. So, Hibernate pretty much works as the DAO layer for me. What's pinching me is the seemingly boilerplate code for transactions, which has to be written in every CRUD method. Is this any better way, or is this the minimum amount of code that is going to be repeated no matter what?

推荐答案

如果您正在使用spring并且能够使用注释。在提供的链接上有一篇很好的文章,显示了如何使用注释将事务中的方法包装起来。

If you are using spring and are able to use annotations. There is a good article on the link provided which shows how to use annotations to wrap a method in a transaction.

http://springinpractice.com/2008/03/18/annotation-based-transactions-in-spring/

同时使用spring和hibernate将使您的代码看起来更简洁,看起来像下面的内容。

using spring and hibernate together would make your code look cleaner and would look something like what is below.

@Override
@Transactional
public void addCompany(Company newCompany) {
    Objects.requireNonNull(newCompany, "newCompany is null.");
    Session session = gileadHibernateUtil.getCurrentSession();
    session.persist(newCompany);
    //session.close(); this line would also not be needed because the session would close automatically when the transaction is complete.
}

这篇关于Hibernate-交易样板代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆