【问题标题】:Problems migrate from Seam3 to DeltaSpike问题从 Seam3 迁移到 DeltaSpike
【发布时间】:2015-06-01 12:06:32
【问题描述】:

我只是在测试从Seam3迁移到DeltaSpike,如果一个bean中只有一个EntityManager,一切正常,但是如果添加其他EntityManager(其他数据源)就会出错:

JBAS010152:应用程序错误:事务在请求中仍处于活动状态,状态为 0

错误项目:

https://github.com/yuanqixun/hellodeltaspike

运行这个项目环境:

  1. wildfly 8.2.0.Final
  2. H2 数据源
  3. MySql 数据源

EntityManagerProducer 代码:

@ApplicationScoped
public class EntityManagerProducer {

  @PersistenceUnit(unitName = "hellodeltaspike")
  EntityManagerFactory emf;

  @PersistenceUnit(unitName = "hellodeltaspike2")
  EntityManagerFactory mysqlemf;

  @Produces
  @ConversationScoped
  EntityManager createEntityManager(){
    return this.emf.createEntityManager();
  }

  @Produces
  @MySqlEm
  @ConversationScoped
  EntityManager createMysqlEntityManager(){
    return this.mysqlemf.createEntityManager();
  }

}

动作代码:

@ConversationScoped
@Named
public class PersonAction implements Serializable{

  @Inject
  EntityManager em;

  @Inject
  @MySqlEm
  EntityManager mysqlEm;

  Person person;

  List<Person> personList;

  @PostConstruct
  void afterCreate(){
    person = new Person();
    personList = queryPersonList();
  }

  private List<Person> queryPersonList() {
    String jql = "select o from Person o ";
    List<Person> result = em.createQuery(jql,Person.class).getResultList();
    if(result == null)
      return new ArrayList<Person>();
    return result;
  }


  @Transactional
  public void btnDoSave(ActionEvent event){
    try {
      if(StringUtils.isEmpty(person.getUuid())){
        em.persist(person);
      }else{
        em.merge(person);
      }
      em.flush();
      String msg = "Saved:"+person.getName();
      FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_INFO,msg,null));
      person = new Person();
      personList = queryPersonList();
    } catch (Exception e) {
      e.printStackTrace();
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), null));
    }
  }
...getter and setter
}

会报错: ERROR [org.jboss.as.txn] (default task-6) JBAS010152: APPLICATION ERROR: transaction still active in request with status 0

【问题讨论】:

  • 欢迎您!如果您可以将问题缩小到最小范围以重现错误,您可能会获得更多支持。阅读整个项目来调试它是一项艰巨的任务,尤其是对于没有报酬的人。祝你好运。
  • @Ciyan 我添加了示例代码。

标签: seam3


【解决方案1】:

修改方法的注解,加上右边EntityManager的特殊限定符,问题就解决了。但是还有一个问题,如何在一个方法中支持多个entityManager的事务?

@Transactional(qualifier = {H2Em.class})

【讨论】:

  • #1 您在这里混合了托管和非托管代码。 #2 如果您在此处使用显式限定符,您只需将 EntityManager 处理限制为具有指定限定符/s 的 Entity-Managers。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2011-10-23
相关资源
最近更新 更多