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.