首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate -事务的样板代码

Hibernate -事务的样板代码
EN

Stack Overflow用户
提问于 2013-01-29 00:37:37
回答 2查看 3.9K关注 0票数 0

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

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

代码语言:javascript
运行
复制
    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方法中编写。这是不是更好的方法,或者这是无论如何都要重复的最小代码量?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-29 00:51:37

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

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

同时使用spring和hibernate会让你的代码看起来更整洁,看起来就像下面这样。

代码语言:javascript
运行
复制
@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.
}
票数 1
EN

Stack Overflow用户

发布于 2016-05-02 18:36:14

在没有spring的情况下,这样的事情可以使用

java.util.function.Function

代码语言:javascript
运行
复制
 public static Object transactionExecutor(Function<Session, Object> toRun) {
    Session session = null;
    Object result = null;
    try {
        session = getSession();
        final Transaction tx = session.beginTransaction();
        result = toRun.apply(session);
        session.flush();
        tx.commit();
        return result;
    } catch (HibernateException he) {
        Transaction tx = session.getTransaction();
        tx.rollback();
    } finally {

        session.close();
    }
    return result;
 }


 public static void save(final Students S) {
    Function<Session, Object> toRun = new Function<Session, Object>() {
        @Override
        public Object apply(final Session t) {
        t.save(S);
        return S.getId();
        }
    };
    int saveID = (int)transactionExecutor(toRun);
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14566701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档