我将基于 Spring 的验证与 Hibernate 验证器结合使用,该验证器由我的应用程序上下文中的以下内容启用:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
....
<property name="jpaPropertyMap">
<map>
<entry key="javax.persistence.validation.factory" value-ref="validator" />
</map>
</property>
</bean>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
我已经实现了一个自定义验证器,它访问数据库以使用 spring 注入的 DAO 检查特定对象的有效性约束。这会导致 java.lang.StackOverflowError ,因为每次从验证器内从数据库加载对象时都会调用验证,从而导致无限循环。为了解决这个问题,我尝试在实体管理器上设置刷新模式,以使用以下代码从验证器内提交:
entityManager.setFlushMode(FlushModeType.COMMIT);
这会导致 hibernate 出现“collection not process bylush()”异常。
是否有从自定义验证器中访问数据库的最佳实践示例,这将使我能够解决这两个问题?
经过大量实验后,最好的方法似乎是直接在代码中使用 EntityManagerFactory。在验证器类的initialize(...)方法中,我有以下代码:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("pu_name");
entityManager = emf.createEntityManager();
缺点是您无法获得 Spring 的 DI 功能,但您仍然可以访问数据库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)