我是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服务类中的休眠引发的异常。
答案 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。