Problema com Remove, Merge e EJB

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. :slight_smile:

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!