从jsr访问数据库
我在我的应用程序上下文中使用基于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"/>
我已经实现了一个自定义验证器来访问数据库,以使用弹簧注入的DAO检查特定对象的有效性约束。 这会导致java.lang.StackOverflowError,因为看起来每次从验证器中的数据库加载对象时都会调用验证,导致无限循环。 为了解决这个问题,我尝试在我的实体管理器上设置刷新模式,使用以下代码从验证器中提交:
entityManager.setFlushMode(FlushModeType.COMMIT);
这会导致“收集不通过flush()处理来自休眠的异常”。
在自定义验证程序中访问数据库有没有一个最佳实践的例子,这将允许我解决这两个问题?
经过大量的实验,看起来最好的方法是直接在代码中使用EntityManagerFactory。 在验证器类的初始化(...)方法中,我有以下代码:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("pu_name");
entityManager = emf.createEntityManager();
缺点是你没有得到Spring的DI功能,但你仍然可以访问数据库。
我也遇到了这个问题,下面是我解决它的方法:@Autowired bean在控制器上使用@Valid,但使用CRUD存储库失败
简而言之,我还获得了对EntityManagerFactory
对象的引用。 不过,我设置setFlushMode
到FlushModeType.COMMIT
只是叫我的服务方法之前。 最后,我将其设置回FlushModeType.AUTO
:
这里是一个例子:
public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {
@PersistenceContext
private EntityManager em;
@Autowired
UserService userService;
@Override
public void initialize(UniqueUsername constraintAnnotation) {
}
@Override
public boolean isValid(String username, ConstraintValidatorContext context) {
try {
em.setFlushMode(FlushModeType.COMMIT);
return userService.findByUsername(username) == null;
} finally {
em.setFlushMode(FlushModeType.AUTO);
}
}
}
链接地址: http://www.djcxy.com/p/82021.html
下一篇: Autowired Repository is Null in Custom Constraint Validator