【问题标题】:org.hibernate.HibernateException: Current transaction is not in progressorg.hibernate.HibernateException:当前事务不在进行中
【发布时间】:2014-02-21 10:12:05
【问题描述】:

您好,我正在尝试处理一些员工对象并保留在数据库中。 Service 层可能会从 DAO 层获得异常。但我仍然需要处理其他员工记录。

请看下面的类示例。这里 Class A.processEmployees() 调用另一个调用 DAO 的类 EmpHandler。即使某个员工出现了一些异常,我也需要处理其他员工并将其保留在数据库中。但是,我收到异常 org.hibernate.HibernateException: Current transaction is not in progress

@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
Class A
{

 public void processEmployees(List<Employee> empList)
 {
   for (Employee emp : empList) 
     new EmpHandler().processEmployee(emp);
 }

}

【问题讨论】:

  • 事务是否开始并活跃到 A#processEmployees 中? EmpHandler#processEmployee 是否抛出异常?
  • @samolisov 没错。

标签: java hibernate spring-mvc


【解决方案1】:

您可以通过调用 new 方法来创建 EmpHandler。因此,Spring Framework 和其他一些容器无法处理这些方法。您不应该自己创建EmpHandler 对象。 Spring Framework 应该创建这个对象。

您可以执行以下操作:

Class A
{

    private IEmpHandler handler;

    public void setEmpHandler(IEmpHandler handler) {
        this.handler = handler;
    }

    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void processEmployees(List<Employee> empList)
    {
        for (Employee emp : empList) 
            handler.processEmployee(emp);
    }
}

class EmpHandler implements IEmpHandler {
    @Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void processEmployee(...) {
    }
}

在您的 context.xml 中:

<bean id="handler" class="...EmpHandler"/>

<bean id="a" class = "...A">
    <property name="handler" ref="handler"/>
</bean>

【讨论】:

    猜你喜欢
    • 2019-02-25
    • 2014-12-04
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多