如题所说,直接看我的解决方法
@Override @Begin(join = true) public void validate() { super.validate(); ((Session) getEntityManager().getDelegate()).setFlushMode(FlushMode.MANUAL); }
通过delegate来设置事务的提交模式
有人会疑问,为什么我们不直接
@Begin(flushMode = FlushModeType.MANUAL, join = true)
这样设置呢,此时存在Seam的上下文环境,但FlushModeType.MANUAL参数无效,具体原因我还没明白。
Seam官方文档:Seam允许你在开始会话时指定FlushModeType.MANUAL参数。 目前,只有Hibernate作为持久化底层提供者时它才能正常工作,但是我们计划支持其它同类计算机厂商扩展。
validate方法在组件被创建时执行
但是在EntityQuery的validate阶段能够开始会话,但是为什么指定FlushModeType.MANUAL参数了,但无效呢?
注:这里的EntityQuery是org.jboss.seam.framework.EntityQuery<E>,validate实现源码
@Override public void validate() { super.validate(); if ( getEntityManager()==null ) { throw new IllegalStateException("entityManager is null"); } if (!PersistenceProvider.instance().supportsFeature(Feature.WILDCARD_AS_COUNT_QUERY_SUBJECT)) { setUseWildcardAsCountQuerySubject(false); } }
@Create public void validate() { if ( getEjbql()==null ) { throw new IllegalStateException("ejbql is null"); } }