【问题标题】:HSQLDB not throwing correct type of ConstraintViolationException with Spring JPA/HibernateHSQLDB 没有使用 Spring JPA/Hibernate 抛出正确类型的 ConstraintViolationException
【发布时间】:2011-12-03 14:05:53
【问题描述】:

我有一个基于 Spring 的 JPA2 应用程序和 HSQLDB 上的 Hibernate 提供程序。我正在尝试优雅地处理异常,但我发现我得到的是休眠异常而不是 JPA 异常。例如:

   import javax.validation.ConstraintViolationException;
   ...

    @Override
    @Transactional
    public Result<Document> save(Document document) {
        try {
            store.persist(document);
            return new Success<Document>(document);
        }
        catch (EntityExistsException e) {
            return new Errors<Document>(DocumentError.DOCUMENT_ALREADY_EXISTS);
        }
        catch (ConstraintViolationException e) {
            return new Errors<Document>(DocumentError.CONSTRAINT_VOILATION);
        }
        catch (PersistenceException e) {
            return new Errors<Document>(DocumentError.UNKOWN_EXCEPTION);
        }
    }

我没有抛出 javax.validation.ConstraintViolationException,而是捕获了 PersistenceException:

javax.persistence.PersistenceException:org.hibernate.exception.ConstraintViolationException:无法插入:[文档]

我已经在我的 Spring 配置中配置了 JpaAdapter:

       <bean id="dataSource"
              class="org.springframework.jdbc.datasource.DriverManagerDataSource"
              p:driverClassName="org.hsqldb.jdbcDriver"
              p:url="jdbc:hsqldb:file:target/db/intox"
              p:username="sa"
              p:password=""
                />

        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
              p:entityManagerFactory-ref="entityManagerFactory"/>

        <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="jpaVendorAdapter" ref="jpaAdapter"/>
            <property name="loadTimeWeaver">
                <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
            </property>
            <property name="persistenceUnitName" value="p"/>
        </bean>

        <bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
            <property name="entityManagerFactory" ref="entityManagerFactory"/>
        </bean>

        <bean id="jpaAdapter"
              class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
              p:database="HSQL"
              p:showSql="false"/>

谁能建议我如何或为什么获得 Hibernate 异常而不是 JPA (javax.persistence) 异常?

附加信息:
春天 3.1.0.M2
Hibernate 3.5.4-Final
休眠验证器 4.1.0.Final
HSQLDB 2.0.0

【问题讨论】:

    标签: hibernate spring exception jpa hsqldb


    【解决方案1】:

    HSQLDB 是不抛出 Java Bean 验证异常的数据库。异常类型是正确的——这没什么奇怪的。 Hibernate 创建了 PersistenceException 并给出了更具体的异常作为原因:org.hibernate.exception.ConstraintViolationException。从javadoc 我们可以找到以下解释:“表明请求的 DML 操作导致违反了定义的完整性约束”。也许您在某处记录了更长的堆栈跟踪,其中还包括 JDBC 驱动程序引发的异常?

    如果不了解更多关于映射以及您尝试插入的 Document 中的值,就不可能说出违反了哪个完整性约束。

    此异常的其他可能性是实体实际上已经存在,因为 Hibernate 有bug HHH-4131 。在该错误报告中被告知,某些版本的 Hibernate 抛出 PersistenceException 而不是指定的 EntityExistsException。

    【讨论】:

    • 我期待一个异常,但我期待 javax.validation.ConstraintViolationException 而不是 javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException
    • 不要那样做,显然你没有违反任何会导致 javax.validation.ConstraintViolationException 被抛出的验证约束。这种异常来自 JSR-303 验证注释。你得到的一个是因为我在回答中解释的原因。
    • 是的,我现在看到验证约束与数据库约束,谢谢
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    相关资源
    最近更新 更多