2015-04-22 2 views
0

Я пытался использовать Vaadin JPAContainer с источником данных ССТ в JBoss, но я получаю эту ошибку при совершении FieldGroup: «сделка не находится в процессе»Vaadin JPAContainer - сделка не находится в процессе

Вот мой persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="Pagamento"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:jboss/datasources/Pagamento</jta-data-source> 

     <class>br.com.edu.entidades.Usuario</class> 

     <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"></property>   
     <property name="hibernate.cache.use_second_level_cache" value="false"></property> 
     <property name="hibernate.hbm2ddl.auto" value="update"></property> 
     <property name="hibernate.show_sql" value="false"></property> 
     <property name="hibernate.format_sql" value="true"></property> 
     </properties> 

    </persistence-unit> 
</persistence> 

Я также использую пользовательский EntityProvider для поддержки JTA:

public class EduEntityProvider extends MutableLocalEntityProvider<Usuario> {  

    private EntityManager em = HibernateUtils.entityManager; 

    public EduEntityProvider() { 
     super(Usuario.class); 
     setEntityManager(em); 

     setEntitiesDetached(false); 
     setTransactionsHandledByProvider(false); 
    } 

    @Override 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    protected void runInTransaction(Runnable operation) { 
     super.runInTransaction(operation); 
    }  

} 

Entity:

@SuppressWarnings("serial") 
@Entity 
@Table(name="usuario") 
public class Usuario extends EduPersistentEntity { 

    @Id 
    @Column(name="id") 
    @VisivelTabela(false) 
    private String id; 

    @Column(name="nome") 
    private String nome; 

    @Column(name="email") 
    private String email; 

    @Column(name="senha") 
    private String senha; 

    @Column(name="matricula", unique=true) 
    private String matricula; 

    gets... 
    sets... 
} 

Если установить сделку обрабатывается поставщиком истина

"setTransactionsHandledByProvider(false);", i'll get the error 
" A JTA EntityManager cannot use getTransaction()". 

Если кто-то может мне точку на рабочий пример, или просто дать мне подсказку о том, что я делаю неправильно, было бы высоко оценено.

+0

Как 'super.runInTransaction (операция) method' выглядеть? – wypieprz

+0

У вас есть конкретная причина использовать JPAContainer? Для любого серьезного использования я предлагаю использовать @Stateless EJB, чтобы скрыть материал JPA с уровня пользовательского интерфейса. Затем просто передайте список объектов объекта для компонентов пользовательского интерфейса с помощью BeanItemContainer. Или, если вы заботитесь о производительности своего приложения, ознакомьтесь с надстройкой Viritin и его [ленивыми функциями загрузки] (https://vaadin.com/web/matti/blog/-/blogs/more-on- ленивые-привязки данные). Они работают лучше, чем JPAContainer (как процессор, так и память) и более просты в использовании. – mstahv

+0

@wypieprz, super.runInTransaction (операция) дает тот же результат ... но спасибо –

ответ

0

Следующая ошибка Спроецировать

JTA EntityManager не может использовать getTransaction()

Других слов, вы не можете назвать EntityTransaction.getTransaction() когда JTA задаются источником данных в настойчивости. XML.


Ниже перечислены общие правила организации Transaction Management, поэтому вы можете следовать одному из них и принять поставщика в соответствии с вашими потребностями.

  • ресурсов локальной транзакции (Java EE/Java SE)

    • приложений управляемый объект менеджер

      @PersistenceUnit(unitName="...") 
      EntityManagerFactory emf; 
      
      public void foo() { 
          em.getTransaction.begin(); //explicit begin 
          ... 
          em.getTransaction.commit(); // explicit commit 
      } 
      
  • JTA транзакции (только Java EE)

    • применение управляемого диспетчер объектов (управляемый компонент транзакции)

      @PersistenceUnit(unitName="...") 
      EntityManagerFactory emf; 
      EntityManager em = emf.createEntityManager(); 
      
      @Resource 
      UserTransaction tx; 
      
      public void foo() { 
          tx.begin(); //explicit begin 
          ... 
          tx.commit(); // explicit commit 
      } 
      
    • управляемого контейнер диспетчер объектов с помощью EJB (управляемого контейнера транзакция)

      @PersistenceContext(unitName="...") 
          EntityManager em; 
      
          @TransactionAttribute(TransactionAttributeType.REQUIRED) //default 
          public void foo() { 
           // implicit begin 
           ... 
           // implicit commit 
          } 
      
    • контейнера управляемый диспетчер объектов через CDI (транзакции, управляемые контейнером)

      @PersistenceContext(unitName="...") 
          EntityManager em; 
      
          @Transactional(TxType.REQUIRED) //default 
          public void foo() { 
           // implicit begin 
           ... 
           // implicit commit 
          } 
      
+0

Я понимаю, но проблема заключается в JPA-контейнере Ваадина. Vaadin FieldGroup пытается сохранить объект, это не мой код. –

+0

Я с трудом могу поверить. Ваш пример выглядит примерно так же, как у Matti Tavhonen [использование JPA Container 2.0 на сервере JEE6] (https://vaadin.com/web/matti/blog/-/blogs/using-jpa-container-2-0-in -a-jee6-server) в блоге. Вы пытались ввести EntityManager вместо назначения HibernateUtil и инициализировать класс, как указано в [ссылочном примере] (https://dev.vaadin.com/svn/incubator/jpacontainer/ee/src/main/java/org/vaadin/jpacontainerjee /EjbEntityProvider.java)? – wypieprz

 Смежные вопросы

  • Нет связанных вопросов^_^