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>