Persistir com JTA não funciona [Resolvido]

Olá galera, eu descobri que minha aplicação não está funcionando com JTA, somente RESOURCE_LOCAL. Porém como a aplicação é empresarial ela precisa ser JTA. Vamos ao problema:

Eu possuo um projeto que tem dois EJB’s, um se conecta ao banco através da unidade de persistência e o outro instacia o bean anterior para enviar as Entities que devem ser registradas no banco de dados. Eu acredito não estar fazendo nada direito, pois não estou injetando os beans e nem usando anotação @PersistenceContext no bean que deveria se conectar ao banco de dados. E quando chamo " entityManager.persist(entity); " ele não retorna a query de insert como qndo usava o RESOURCE_LOCAL, apenas exibe " Hibernate: select nextval (‘entity_code_seq’) " e prossegue para a finalização do programa.

Abaixo seguem os códigos:

Possuo um módulo WAR que instancia o EJB Core para receber os dados e formar Entity.

public class BuyToken extends HttpServlet {
    
    private Core core;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        core = new Core(request.getParameter("name"), 
                new Hex(request.getParameter("andress")),
                request.getParameter("cpf_cnpj"),
                request.getParameter("agency"),
                request.getParameter("account"),
                Long.valueOf(request.getParameter("amount")),
                request.getParameter("payment_option")
        );
//Existe mais código abaixo, porém é só pra impressão

O EJB abaixo está localizado em outro módulo, porém no mesmo projeto.

@Stateless
public class Core implements CoreLocal {
   
    private EntityBean entityBean; // Eu deveria usar @EJB aqui e não precisar instanciar, mas não funciona

    private Entity entity;
 
    public Core() {
        entity = new Entity();
    }

    public Core(String name, Hex andress, String cpfCNPJ, String agency, String account, Long amount, String paymentOption) {
        entity = new Entity();
        
        entity.setName(name);
        entity.setAndress(andress.toString());
        entity.setCpfCnpj(cpfCNPJ);
        entity.setAgency(agency);
        entity.setAccount(account);
        
        entityBean = new EntityBean(); //Se eu não instanciar ele retorna null e dá NullPointerException
    }

    @Override
    public BigInteger doOperation() {
        
        if (operation.getPaymentOption().isEmpty()) {
            return BigInteger.ONE;
        } else {
            BigInteger id = new BigInteger(64, new Random());
            try {
                
                if(entityBean == null)
                {
                    Logger.getLogger(Entity.class.getName()).log(Level.INFO, "EntityBean is Null");
                }
                if(entity == null)
                {
                    Logger.getLogger(Entity.class.getName()).log(Level.INFO, "Entity is null");
                }
                
                entity = entityBean.save(entity);
                Logger.getLogger(Entity.class.getName()).log(Level.INFO, "Entity: " + entity.toString());
            } catch (Exception ex) {
                
                Logger.getLogger(Core.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            return id;
        }
    }

O EJB abaixo está localizado em outro módulo, porém no mesmo projeto.

@Stateless
public class EntityBean implements EntityBeanLocal {
    private final EntityManager entityManager;
    
    public EntityBean() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("DBConPU");
        entityManager = emf.createEntityManager();
    }
    
    @Override
    public Entity save(Entity entity) throws Exception {
        entityManager.persist(entity);
        return entity;
    }
}

O persistence está no pacote META-INF do Módulo acima.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="DBConPU" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>jdbc/UnionDB</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
      <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.SunONETransactionManagerLookup"/>
      <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" />
      <property name="hibernate.hbm2ddl.auto" value="update" />
    </properties>
  </persistence-unit>
</persistence>

Fluxo da Informação: Módulo WAR -> Módulo EJB Core <-> Módulo EJB EntityBean

Eu preciso demais usar JTA e entender o que to fazendo errado, principalmente se for a injeção dos EJB’s que não estou fazendo, ou se alguma configuração está errada.

Estou usando: JAVA EE 7 + Glassfish 4.1 + Postgres 9.6 + Hibernate 4.3.1 + NetBeans 8.2

Agradeceria qualquer ajuda.

A parte que você diz que tinha que usar @EJB mas não funciona, dá algum erro?

obs.: Para usar o EJB corretamente com JTA, você deve injetar seu bean com @EJB.

Olá Lucas, obrigado por me responder :). Ele dava erro informando que não conseguia referenciar o Local Bean, eu não entendia pq dava esse erro… Então refiz o projeto e do nada funcionou, a única coisa que fiz foi evitar usar o “Assemby Module (EAR)” e ta rodando até agora de boas. Eu com certeza fiz algo errado no outro, porém não sei o que :confused:

1 curtida