Olá pessoal,
Já postei algumas dúvida qto ao CDI, EJB e JSF, e a coisa tá começando a andar…
mas me deparei com um problema com remoção de objetos através de EJBs.
[code]
public abstract class GenericDAO {
protected abstract EntityManager getEntityManager();
private Class<T> entityClass;
public GenericDAO(Class<T> entityClass){
this.entityClass = entityClass;
}
public void create(T entity){
System.out.println(getEntityManager().toString());
getEntityManager().persist(entity);
}
public T find(Object id){
return getEntityManager().find(entityClass, id);
}
}
@Stateless
public class CBOSDao extends GenericDAO {
@PersistenceContext
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public CBOSDao() {
super(CBOS.class);
}
public void remove(CBOS cbos) {
try {
getEntityManager().remove(cbos);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}[/code]
O erro:
E se coloco o merge antes de remover ele tenta inserir e dá erro de duplicidade da chave.
Alguém já viu isso?
esse remove esta em um datatable e cada linha tem seu remover e atualizar?
mal ai esse problema nao tem nada haver
calma ai ja te ajudo
[quote=UpTheIrons]Olá pessoal,
Já postei algumas dúvida qto ao CDI, EJB e JSF, e a coisa tá começando a andar…
mas me deparei com um problema com remoção de objetos através de EJBs.
[code]
public abstract class GenericDAO {
protected abstract EntityManager getEntityManager();
private Class<T> entityClass;
public GenericDAO(Class<T> entityClass){
this.entityClass = entityClass;
}
public void create(T entity){
System.out.println(getEntityManager().toString());
getEntityManager().persist(entity);
}
public T find(Object id){
return getEntityManager().find(entityClass, id);
}
}
@Stateless
public class CBOSDao extends GenericDAO {
@PersistenceContext
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public CBOSDao() {
super(CBOS.class);
}
public void remove(CBOS cbos) {
try {
getEntityManager().remove(cbos);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}[/code]
O erro:
E se coloco o merge antes de remover ele tenta inserir e dá erro de duplicidade da chave.
Alguém já viu isso?
[/quote]
confirma duas coisas:
Seu objeto ao qual você da o merge estava com o id preenchido ao dar o merge? (vê debugando ou via sysout mesmo);
o merge retorna um objeto… certifique-se de que você está dando o remove no objeto retornado pelo merge e não no passado como parâmetro para ele.
desconfio que o seu problema seja o primeiro caso. veja ai se é algum dos dois.
se der para colocar o log completo seria bom
mas acredito eu que isso ja resolve seu problema
o problema esta no seu método remover
mude para isso
No seu CBOSDao - coloque assim
public CBOS getCBOSById(int id){
return getPojoFind(CBOS.class, id);
}
No ManageBean - Coloque isso
public void removerCBOS(int id){
CBOS cbos = geCBOSById(id);
if(cbos != null){
getEntityManager().remove(cbos);
}
tenta ai e me fale
Opa, tô em outro local de trabalho, mas vamos lá…
O Id é preenchido manualmente.
E eu já tinha feito algo assim:
[quote]
public void removerCBOS(int id){
CBOS cbos = geCBOSById(id);
if(cbos != null){
getEntityManager().remove(cbos);
} [/quote]
Funciona, mas eu n quero precisar fazer uma busca antes, ele tem q remover, caso contrário, retornar alguma exceção e tal.
Acredito que seja isso, mas se for diferente disso eu terei q fazer a busca.
Falews por enqto. 
Então pessoal, como estou estudando JSF agora, n entendia pq o povo falava tando da falta do @ViewScoped em projeto CDI, mas agora entendi,
e o meu problema aí está justamente associado a isso.
Mas blz, valeu!