【发布时间】:2015-05-19 21:55:25
【问题描述】:
我有以下会话工厂配置:
<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 表中。
为什么实际结果与预期不同?
附言
附言
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.Finalhibernate-annotations: 3.3.1.GA -> 3.5.6-Finalhibernate-commons-annotations: 3.3.0.ga -> 3.2.0.Finalhibernate-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. 对于会话工厂:
<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-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();终端.setCost(98L); ValidatorFactory 工厂 = Validation.buildDefaultValidatorFactory();验证器验证器 = factory.getValidator(); Set
> constraintViolations = validator.validate(terminal); if (constraintViolations != null && constraintViolations.size() > 0) { // 在这里处理你的异常 } else { session.save(terminal); } 是显式验证器考虑的注释吗? -
您找到解决方案了吗?
-
@Rohit 是的,主题已更新
-
@witchedwiz 主题已更新
-
我认为事务管理器的变化起到了作用
标签: java spring hibernate persistence hibernate-validator