У меня есть следующая конфигурация сеанса 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>
На самом деле я не понял, какой конкретный шаг разрешил мою проблему, но в комплексе он действительно работает.