从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对象的引用。 不过,我设置setFlushModeFlushModeType.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

上一篇: Database access from jsr

下一篇: Autowired Repository is Null in Custom Constraint Validator