在数据库中持久化不会发生hibernate验证

gst*_*low 11 java spring persistence hibernate hibernate-validator

我有以下会话工厂配置:

     <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>
Run Code Online (Sandbox Code Playgroud)

终端类:

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

我的服务方法中有以下代码:

Terminal terminal = new Terminal();
terminal.setCost(98L);
session.save(terminal);
Run Code Online (Sandbox Code Playgroud)

当我调用它时,新行添加在terminal表中.
预期结果:验证异常和新行不会添加到terminal表中.

为什么实际结果与预期不同?

PS

据我所知,它应该开箱即用 http://docs.jboss.org/hibernate/validator/4.1/reference/en-US/html/validator-checkconstraints.html#validator-checkconstraints-orm-hibernateevent

PPS

hibernate的东西依赖:

       <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>
Run Code Online (Sandbox Code Playgroud)

解析度

执行以下步骤后,问题就消失了:

1.迁移libary版本:

hibernate-core:3.3.2.GA - > 4.3.10.Final:3.3.1.GA - > 3.5.6-
hibernate-annotationsFinal
hibernate-commons-annotations:3.3.0.ga - >
hibernate-validator3.2.0.Final:4.2.0.Final - > 5.1.3 .最后

删除依赖:

<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>persistence-api</artifactId>
    <version>1.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

2.在配置中更换

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
     <property name="sessionFactory" ref="sessionFactory"/>
</bean
Run Code Online (Sandbox Code Playgroud)

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
     <property name="sessionFactory" ref="sessionFactory"/>
 </bean
Run Code Online (Sandbox Code Playgroud)

3.对于会议工厂:

<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>
Run Code Online (Sandbox Code Playgroud)

<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>
Run Code Online (Sandbox Code Playgroud)

4.会话工厂配置:

<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>
Run Code Online (Sandbox Code Playgroud)

实际上我不明白哪个具体步骤解决了我的问题,但在复杂的情况下它确实有效

Har*_*rdy 1

您引用的配置属性适用于 JPA。如果您使用 JPA API,它应该可以工作。看起来您正在使用本机 Hibernate ORM 会话 API。您需要使用EntityManagerAPI。