gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:47:20 24 4
gpt4 key购买 nike

我有以下 session 工厂配置:

     <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 表中。

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

附言

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

附言

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>

分辨率

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

1.迁移库版本:

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. 对于 session 工厂:

<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. session 工厂配置:

<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>

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

最佳答案

您引用的配置属性适用于 JPA。如果您使用的是 JPA API,它应该可以工作。看起来您正在使用 native Hibernate ORM Session API。您需要使用 EntityManager API。

关于java - 在数据库中持久化时不会发生 hibernate 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30336846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com