javasf@googlegroups.com
[Top] [All Lists]

Re: [javasf] EJB + CDI + JPA

Subject: Re: [javasf] EJB + CDI + JPA
From: Carlos Eduardo Serpa
Date: Thu, 18 Aug 2011 15:10:08 -0300
Olá Thiago,

Escolhi a última opçõa, estou fazendo teste com um factory EJB injetanto o entity manager, passando como parametro do construtor de um DAO não EJB esse entity.

@Stateless
public class DaoFactory {
  @PersistenceContext
  private EntityManager entityManager; 

   
  @Produces
  public DAO create(InjectionPoint injectionPoint) throws Exception {
    ParameterizedType type = (ParameterizedType) injectionPoint.getType();
    Class classe = (Class) type.getActualTypeArguments()[0];
    return new DAO(classe, entityManager);
  }
}

Como acabei de mudar para o netbeans 7.0 estou tendo um probleminha quando importei o projeto .. pelo que vi é alguma configuração do JPA.
Object: br.com.webapp.entity.__EJB31_Generated__Livros__Intf___779868884 is not a known entity type
Se alguém puder me ajudar quanto ao erro acima...

Obrigado Thiago, depois que testar tudo .. deixo meus comentários.


2011/8/18 thiago moraes <thiagoampj@xxxxxxxxx>
Correto, tem que ter construtor default.


Esse é um problema, criar um DAO EJB. Não é uma boa prática ter um DAO como EJB só para injetar o EntityManager.

Algumas pessoas o fazem, outras dizem que não é legal e utilizam o EntityManger direto no EJB.

Realmente é um desperdício de recurso. O ciclo de via deles é meio complexo.

Ainda existem alguns que criam factories de DAO como Stateless, então vc pode injetar o EntityManager na factory e ela criar seu Dao e passar a referencia do EntityManager.

Qual você prefere?


2011/8/16 Carlos Eduardo Serpa <cadu.sousa@xxxxxxxxx>
Olá Thiago,

como faço para DAO ser gerenciado pelo container... tenho que adiconar a anotação @Stateless ou @Statefull ?


public class DAO<T> implements Serializable {
  private final Class<T> classe;
  @PersistenceContext <-- não está injetando
  private EntityManager em;


  public DAO(Class<T> classe) throws Exception{
    this.classe = classe;
  }

  public void adiciona(T obj) throws Exception{
    em.persist(obj);
  }
..
}
para

(Tem um problema, pois alerta que o EJB tem que ter um construtor default e acho que nao estão conseguindo implementá-lo pois diz que a variavel não pode ser inicializada)
@Stateless
public class DAO<T> implements Serializable {
  private final Class<T> classe;
  @PersistenceContext <-- não está injetando
  private EntityManager em;


  public DAO(Class<T> classe) throws Exception{
    this.classe = classe;
  }

  public void adiciona(T obj) throws Exception{
    em.persist(obj);
  }
...

}


2011/8/11 thiago moraes <thiagoampj@xxxxxxxxx>
Fala aí,

Seguinte,

1- Sua exception pode ser checked,

2- No container você só poder utilizar as injeções nos caras que são gerenciados por ele. Otherwise você terá que fazer lookup.


2011/8/11 Carlos Eduardo Serpa <cadu.sousa@xxxxxxxxx>
Olá,

Tenho algumas dúvidas quanto a uma estrutura que estou usando.

Meu BackingBean(JSF) chama um método da camada de negocio onde estou usando EJB.

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class LivroService implements IService<Livro>{
    @Inject
    DAO<Livro> daoLivro;
   
    @Override
    public void adiciona(Livro obj) throws Exception {       
        daoLivro.adiciona(obj);
    }
...
}

1º - rollback com exceptions em EJB ... sempre terei que lançar um RuntimeException como exceções de aplicações, pois é a unica forma que vi que funciona
o rollback.

O daoLivro é injetado através de um factory

public class DaoFactory {
  @Produces
   public DAO create(InjectionPoint injectionPoint) {
    ParameterizedType type = (ParameterizedType) injectionPoint.getType();
    Class classe = (Class) type.getActualTypeArguments()[0];
    return new DAO(classe);
  } 
}

A seguir o 2º problema, no DAO o EntityManager está vindo nulo. Se injeto ele no Service ele funciona no Dao não... Alguém poderia me ajudar ?
Tem algo a ver com Contexto.. ???

public class DAO<T> implements Serializable {
  private final Class<T> classe; 
  @PersistenceContext(name = "webj2eePU")
  private EntityManager entityManager;
 
  public DAO(Class<T> classe) {
    this.classe = classe;
  } 

  public void adiciona(T entity) throws Exception {
    entityManager.persist(entity);   
  }
...
}

--
My best regards
Carlos Eduardo Serpa de Sousa
Systems Analyst
Sun Certified Programmer for Java 2 Platform, Standard Edition 5.0 - SCJP

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
Thiago Alves de Moraes
thiagoampj@xxxxxxxxx

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
My best regards
Carlos Eduardo Serpa de Sousa
Systems Analyst
Sun Certified Programmer for Java 2 Platform, Standard Edition 5.0 - SCJP

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
Thiago Alves de Moraes
thiagoampj@xxxxxxxxx

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
My best regards
Carlos Eduardo Serpa de Sousa
Systems Analyst
Sun Certified Programmer for Java 2 Platform, Standard Edition 5.0 - SCJP

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil
<Prev in Thread] Current Thread [Next in Thread>