Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate验证不需要';在持久化数据库中不会发生这种情况_Java_Spring_Hibernate_Persistence_Hibernate Validator - Fatal编程技术网

Java hibernate验证不需要';在持久化数据库中不会发生这种情况

Java hibernate验证不需要';在持久化数据库中不会发生这种情况,java,spring,hibernate,persistence,hibernate-validator,Java,Spring,Hibernate,Persistence,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

我有以下会话工厂配置:

     <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>
<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>
我的服务方法中有以下代码:

Terminal terminal = new Terminal();
terminal.setCost(98L);
session.save(terminal);
当我调用它时,新行会添加到
terminal
表中。
预期结果:验证异常和新行未添加到
terminal
表中

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

p.S.

据我所知,它应该是开箱即用的

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>
2.在配置中被替换

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


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

如果您使用的是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>

您需要使用Hibernate验证程序。 这里是maven人工制品

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

org.hibernate

您必须使用
@Range
注释,该注释可在
org.hibernate.validator.constraints
包中找到


我没有编译这段代码。因此,它们可能是语法错误。

您似乎混合了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>
javax.validation.groups.Default
javax.validation.groups.Default

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


很抱歉,这个愚蠢的问题,但是如何理解我使用JPA Api或本机hibernate会话Api?您认为我使用的hibernate validator版本错误吗?请检查您的版本中有哪些功能,也许@annotation for validation确实无法与您的版本一起正常工作如果您没有任何依赖性限制,我将尝试使用这个版本,并按照我附加的文档检查它是否有效。在我们的情况下,它就像一个charmNo。应用您的建议后,我没有看到更改当我将事件添加到hibernate.cfg.xml中时,我看到以下错误“元素类型“会话工厂”的内容必须匹配”(属性*、映射*、类缓存|集合缓存)、事件*、侦听器)。“可能我使用了不一致的hibernate版本?这些版本用于persistence.xml.Mmm,抱歉,我不是冬眠大师。我只有冬眠。您复制的配置与JPA相同。不幸的是,我看到了老错误,在你提出申请后,我没有看到行为纠正,只是想知道是否一切正常。。如果你做这样的事。。端子=新端子();终端成本(98L);ValidatorFactory=Validation.buildDefaultValidatorFactory();Validator Validator=factory.getValidator();设置constraintViolations=validator.validate(终端);如果(constraintViolations!=null&&constraintViolations.size()>0){//在此处处理您的异常}否则{session.save(terminal);}显式验证器是否考虑了注释?您得到了解决方案吗?@Rohit Yes,话题updated@witchedwiz主题更新我认为事务管理器的改变起了作用
<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>
<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>
 <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>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
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
}
<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>