定义HibernateExceptionTranslator:在bean工厂中找不到持久性异常转换器

时间:2012-02-03 22:10:34

标签: java hibernate spring jpa

我正在尝试注入一个eventRepository,它是我项目中的Spring Data Repository:

public class App {

    protected static EntityManagerFactory factory;

    @Autowired
    protected EventRepository eventRepository;

    public void execute() {
        Event foo = eventRepository.findBySlug("abraxas");
    }

    public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("beans.xml");

        App runner = (App) context.getBean("AppBean");
        runner.execute();
    }
}

的beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/data/jpa
            http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <bean id="AppBean" class="org.app.App"></bean>
    <jpa:repositories base-package="org.app.repository" />
</beans>

但是当我运行它时,我得到以下异常:

java.lang.IllegalStateException: No persistence exception translators found in bean factory. Cannot perform exception translation.
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators

在一些评论中,我发现我需要“配置HibernateExceptionTranslator”,但我没有设法找出方法。

我正在尝试关注official documentation,但未提及HibernateExceptionTranslator的配置。

由于

3 个答案:

答案 0 :(得分:4)

显然解决方案是添加

     <bean class="org.springframework.orm.hibernate4.HibernateExceptionTranslator"/>

到beans.xml

感谢JB Nizet找到解决方案。

答案 1 :(得分:1)

使用Java Config:

@Bean
public HibernateExceptionTranslator hibernateExceptionTranslator() {
    return new HibernateExceptionTranslator();
}

如果使用Hibernate 3,则使用此导入:

import org.springframework.orm.hibernate3.HibernateExceptionTranslator;

或者如果使用Hibernate 4:

import org.springframework.orm.hibernate4.HibernateExceptionTranslator;

答案 2 :(得分:0)

根本原因是Java.lang.IllegalStateException,它不是hibernateException的子类,春天的HibernateExceptionTranslator可以将您的例外转换为DataAccessException(Runtime Exception)

因此,不是HibernateExceptionTranslator在配置文件中添加org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessorapplicationC0ntext-*.xml。然后在@Repository或配置文件中使用适当的组件扫描在持久性文件中标记applicationC0ntext-*.xml注释。