Java HibernateExceptionTranslator和HibernateAppDialect之间的区别是什么?

Java HibernateExceptionTranslator和HibernateAppDialect之间的区别是什么?,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我想将Hibernate异常转换为Spring异常(DataAccessException的子类)。我认为在数据源配置中添加如下bean,然后用@Repository注释我的DAO类就足够了,因为我使用LocalSessionFactoryBean(HibernateExceptionTranslator的子类)来管理事务 <bean id="exceptionTranslator" class="org.springframework.dao.annotat

我想将Hibernate异常转换为Spring异常(DataAccessException的子类)。我认为在数据源配置中添加如下bean,然后用@Repository注释我的DAO类就足够了,因为我使用LocalSessionFactoryBean(HibernateExceptionTranslator的子类)来管理事务

<bean id="exceptionTranslator" class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor">
将下面的bean添加到数据源配置之后

<bean id="jpaVendor" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
基于Spring,我了解到需要一些翻译人员来完成此翻译工作:

后处理器会自动查找所有异常转换器 (PersistenceExceptionTranslator接口的实现)和 通知所有标记有@Repository注释的bean,以便 发现的转换器可以截取并应用适当的 在抛出的异常上进行转换

问题

PersistenceExceptionTranslator实现HibernateExceptionTranslator和HibernateAppDialect之间有什么区别?在我的例子中,为什么LocalSessionFactoryBean不翻译异常(没有HibernateAppDialect)

我的数据源配置(datasource.xml):


org.hibernate.dialogue.postgresql95dialogue
com.myapp.app.dao.PersistenceValidationGroup
com.myapp.app.dao.PersistenceValidationGroup
com.myapp.app.dao.PersistenceValidationGroup
com.myapp.app.dao
来自UserDao.java的示例:

@Repository
@Transactional
@Component("usersDao")
public class UserDao { 

    @Autowired
    private SessionFactory sessionFactory;
    
    private Session getSession() {
        return sessionFactory.getCurrentSession();
    }
    
    public List<User> getUsers() {
        List<User> users = getSession().createQuery("from Userr").list();
        return users;
    }
}
@存储库
@交易的
@组件(“usersDao”)
公共类UserDao{
@自动连线
私人会话工厂会话工厂;
私有会话getSession(){
返回sessionFactory.getCurrentSession();
}
公共列表getUsers(){
List users=getSession().createQuery(“来自Userr”).List();
返回用户;
}
}
更新

HibernatePadialect方法TranslateExceptionIfEnable调用EntityManagerFactoryUtils.ConvertJPAAccessExceptionIfEnable(ex)来转换异常

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: Userr is not mapped [from Userr]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Userr is not mapped [from Userr]
    <context:annotation-config></context:annotation-config>

    <context:component-scan
        base-package="com.myapp.app"></context:component-scan>

    <beans profile="dev">
        <context:property-placeholder
            location="classpath:com\\myapp\\app\\test\\config\\jdbc.properties" />
        <bean id="dataSource"
            class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName" value="${jdbc.driver}"></property>
            <property name="url" value="${jdbc.url}"></property>
            <property name="username" value="${jdbc.username}"></property>
            <property name="password" value="${jdbc.password}"></property>
        </bean>

        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"
            lazy-init="default">
            <property name="dataSource" ref="dataSource"></property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL95Dialect</prop>
                    <prop key="javax.persistece.validation.group.pre-persist">com.myapp.app.dao.PersistenceValidationGroup
                    </prop>
                    <prop key="javax.persistece.validation.group.pre-update">com.myapp.app.dao.PersistenceValidationGroup
                    </prop>
                    <prop key="javax.persistece.validation.group.pre-remove">com.myapp.app.dao.PersistenceValidationGroup
                    </prop>
                </props>
            </property>
            <property name="packagesToScan">
                <list>
                    <value>com.myapp.app.dao</value>
                </list>
            </property>
        </bean>


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

        <tx:annotation-driven />

        <bean id="exceptionTranslator"
            class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor">
        </bean>
        <bean id="jpaVendor"
            class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />


    </beans>


</beans>
@Repository
@Transactional
@Component("usersDao")
public class UserDao { 

    @Autowired
    private SessionFactory sessionFactory;
    
    private Session getSession() {
        return sessionFactory.getCurrentSession();
    }
    
    public List<User> getUsers() {
        List<User> users = getSession().createQuery("from Userr").list();
        return users;
    }
}