HSQLDB не генерирует правильный тип исключения ConstraintViolationException с помощью Spring JPA / Hibernate - PullRequest
0 голосов
/ 08 октября 2011

У меня есть приложение на основе Spring JPA2 с провайдером Hibernate на HSQLDB.Я пытаюсь элегантно обрабатывать исключения, но обнаруживаю, что получаю исключения в спящем режиме, а не 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: моглине вставить: [Документ]

Я настроил JpaAdapter в своей конфигурации Spring:

       <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) единицы?

Дополнительная информация:
Spring 3.1.0.M2
Hibernate 3.5.4-Final
Hibernate Validator 4.1.0.Final
HSQLDB 2.0.0

1 Ответ

1 голос
/ 08 октября 2011

HSQLDB - это база данных, которая не генерирует исключения проверки Java Bean.Тип исключения правильный - ничего странного в этом нет.Hibernate создал PersistenceException и дал более конкретное исключение в качестве причины: org.hibernate.exception.ConstraintViolationException .Из javadoc мы можем найти следующее объяснение: «указывающее, что запрошенная операция DML привела к нарушению определенного ограничения целостности».Может быть, вы где-то еще записали в стек трассировку, к которой также добавлено исключение, генерируемое JDBC-драйвером?

Не зная больше о отображениях и значениях в Document, которые вы пытаетесь вставить, невозможно сказать, какое ограничение целостности являетсяНарушено.

Другая возможность для этого исключения состоит в том, что сущность на самом деле уже существует, потому что Hibernate имеет ошибка HHH-4131 .В этом сообщении об ошибке сказано, что некоторые версии Hibernate генерируют исключение PersistenceException вместо указанного EntityExistsException.

...