Подтвердить что ты не робот

Проверка hibernate не выполняется в базе данных

У меня есть следующая конфигурация сеанса factory:

     <session-factory>
        <property name="javax.persistence.validation.group.pre-persist">javax.validation.groups.Default</property>
        <property name="javax.persistence.validation.group.pre-update">javax.validation.groups.Default</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="hibernate.showSql">true</property>
        <property name="hbm2ddl.auto">validate</property>
        <mapping class="com.terminal.domain.Terminal"/>
        ...
    </session-factory>

Класс терминала:

@Entity
@Table(name = "terminal")
public class Terminal {
    @Column(name = "cost")
    @Min(100)
    private Long cost;
    // get and set
}

У меня есть следующий код в моем методе обслуживания:

Terminal terminal = new Terminal();
terminal.setCost(98L);
session.save(terminal);

Когда я вызываю его, новая строка добавляется в таблицу terminal.
ожидаемый результат: исключение проверки и новая строка не добавляются в таблицу terminal.

Почему фактический результат отличается от ожидаемого?

P.S.

Как я понял, он должен работать из коробки http://docs.jboss.org/hibernate/validator/4.1/reference/en-US/html/validator-checkconstraints.html#validator-checkconstraints-orm-hibernateevent

P.P.S.

зависимости между спящим файлом:

       <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>3.3.2.GA</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
            <version>3.3.1.GA</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>3.3.0.ga</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.2.0.Final</version>
        </dependency>

Решение

Проблема исчезает после следующих шагов:

1. перенастроить libary версии:

hibernate-core: 3.3.2.GA → 4.3.10.Final
hibernate-annotations: 3.3.1.GA → 3.5.6-Final
hibernate-commons-annotations: 3.3.0.ga → 3.2.0.Final
hibernate-validator: 4.2.0.Final → 5.1.3.Final

удаленная зависимость:

<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>persistence-api</artifactId>
    <version>1.0</version>
</dependency>

2. заменен в конфигурации

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

с

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

3. и для сеанса factory:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation">
            <value>classpath:hibernate-test.cfg.xml</value>
        </property>
        <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.connection.charSet">UTF-8</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hbm2ddl.auto">create-drop</prop>
            </props>
        </property>
</bean>

с

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation">
            <value>classpath:hibernate-test.cfg.xml</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.connection.charSet">UTF-8</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hbm2ddl.auto">create-drop</prop>
            </props>
        </property>
    </bean>

4. сеанс factory конфигурация:

<session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="hibernate.showSql">true</property>
        <property name="hbm2ddl.auto">validate</property>
        ...//classes mapping
</session-factory>

На самом деле я не понял, какой конкретный шаг разрешил мою проблему, но в комплексе он действительно работает.

4b9b3361

Ответ 1

Свойства конфигурации, на которые вы ссылаетесь, относятся к JPA. Если вы используете JPA API, он должен работать. Похоже, вы используете собственный API сеансов Hibernate ORM. Вам нужно использовать API EntityManager.

Ответ 2

Если вы используете JPA, вам нужно добавить следующие слушатели EntityManager:

<event type="pre-update">
    <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
</event>
<event type="pre-insert">
    <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
</event>
<event type="pre-delete">
    <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
</event>

А также добавьте следующее свойство:

<property name="javax.persistence.validation.mode">
  ddl, callback
</property>

Если вы используете конфигурацию Hibernate, с hibernate.cfg.xml, то конфиги становятся:

 <event type="pre-update">
   <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
</event>
<event type="pre-insert">
    <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
</event>
<event type="pre-delete">
    <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
</event>

Ответ 3

Вам нужно использовать валидатор Hibernate. Здесь артефакт maven

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>

Здесь вы получите начальную документацию.

http://hibernate.org/validator/documentation/getting-started/

Ответ 4

Вы должны использовать аннотацию @Range, которая доступна в пакете org.hibernate.validator.constraints.

https://docs.jboss.org/hibernate/validator/4.1/api/org/hibernate/validator/constraints/Range.html

import org.hibernate.validator.constraints.Range;
...

@Entity
@Table(name = "terminal")
public class Terminal {
    @Column(name = "cost")
    @Range(min=100, message="Should be of min length 10.")
    private Long cost;
    // get and set
}

Я не компилировал этот код. Таким образом, они могут быть синтаксическими ошибками.

Ответ 5

Кажется, вы смешиваете JPA и Hibernate специфические api. В вашем файле конфигурации удалите:

<property name="javax.persistence.validation.group.pre-persist">javax.validation.groups.Default</property>
<property name="javax.persistence.validation.group.pre-update">javax.validation.groups.Default</property>

и добавьте

   <event type="pre-update">
     <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
   </event>
   <event type="pre-insert">
     <listener class="org.hibernate.cfg.beanvalidation.BeanValidationEventListener"/>
   </event>