春季无法捕获休眠异常

时间:2018-09-01 03:19:24

标签: java spring hibernate spring-transactions

我是Spring框架的新手。使用Spring 4.3和Hibernate 4开发Web应用程序。

我配置了必需的bean。

UIView.animate

这是我的服务课程

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName"
        value="${oracle.driver-calss}" />
    <property name="url" value="${oracle.Url}" />
    <property name="username" value="${oracle.userName}" />
    <property name="password" value="${oracle.password}" />
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${oracle.dialect}</prop>
            <prop key="hibernate.hbm2ddl.auto">${oracle.hbm2ddl}</prop>
            <prop key="hibernate.show-sql">${oracle.show-sql}</prop>
        </props>
    </property>
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.wmosIIBL.model"></property>
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven />

DAO Impl代码:我故意犯一些错误以创建异常。因此,请忽略代码错误,并帮助我找到如何捕获引发的异常。

@Service
public class ItemIBLService {

    @Autowired
    ItemIBLDaoImpl itemIBLDaoImpl;

    @Transactional
    public ItemInvnByLcn getItemIBLByDspLocn(String dspLocn) {
        ItemInvnByLcn itemInvnByLcn = null;
        try {
            itemIBLDaoImpl.getIBLByDspLocn(dspLocn);
        } catch (DataAccessException dataAccessException) {
            System.out.println(dataAccessException.getMessage().toString());
        }
        return itemInvnByLcn;
    }

}

Hibernate抛出以下异常,我无法在服务类中捕获该异常。

@Repository
public class ItemIBLDaoImpl {

    @Autowired
    SessionFactory sessionFactory;

    public ItemInvnByLcn getIBLByDspLocn(String dspLocn) {
        Session currentSession = sessionFactory.getCurrentSession();
        SQLQuery sqlQuery = currentSession.createSQLQuery("SELECT * FROM WHERE ITEMINVNBYLOCN WHERE LOCATION= :DSPLOCN");
        sqlQuery.setParameter("SDPLOCN", dspLocn);
        List iiblList = sqlQuery.list();
        System.out.println(iiblList.toString());
        return (ItemInvnByLcn) iiblList.get(0);
    }

}

我认为我在使用中缺少一些东西。请让我知道为什么即使我在服务层中使用@Service和@Transactional以及在Dao层中使用@Repository,也无法捕获spring服务类中的休眠引发的异常。

2 个答案:

答案 0 :(得分:0)

<ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"ANOwCS3enYdqqcN01iAJg7EgRDhAC/Gpb3/h6yCGz2qSrKEz874ANBYeKGQuKSc3ctopIixI4rKiKuC5FJdsnQ==", "accept"=>{"accepted"=>"1", "complete"=>"0"}, "commit"=>"Create Accept", "controller"=>"accepts", "action"=>"create", "self_delivery_id"=>"1"} permitted: false> 不是org.hibernate.QueryParameterException(您要捕获的那个)的子类,正如您在其javadoc中看到的那样。 如果要捕获此异常,则应将其添加到catch块中。这是DataAccessException,因此,如果您像以前一样忽略它,则编译器不会说什么。

尝试一下:

RuntimeException

答案 1 :(得分:0)

您正在捕获DataAccessException,如果您想捕获QueryParameterException,那是不正确的。您可以直接捕获QueryParameterException,也可以捕获QueryException或HibernateException。

我建议捕获HibernateException用于所有与查询相关的异常。

您可以在此处遵循DataAccessException的层次结构 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/dao/DataAccessException.html

和QueryParameterException https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/QueryParameterException.html

DataAccessException更具可恢复性,这意味着从代码角度看一切都很好,而在访问数据库时发生了不好的事情。

但是您要尝试执行的操作是未到达数据库,它在尝试创建查询时失败,因此未处理DataAccessException。