Problema com Remove, Merge e EJB

6 respostas
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.

public abstract class GenericDAO<T> {

	
	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<CBOS> {
	
	@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());
		}

	}
}

O erro:

10:15:48,772 INFO [org.hibernate.event.internal.DefaultDeleteEventListener] (http--127.0.0.1-8080-1) HHH000114: Handling transient entity in delete processing

E se coloco o merge antes de remover ele tenta inserir e dá erro de duplicidade da chave.

Alguém já viu isso?

6 Respostas

tmvolpato

esse remove esta em um datatable e cada linha tem seu remover e atualizar?

tmvolpato

mal ai esse problema nao tem nada haver

calma ai ja te ajudo

maior_abandonado
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.

public abstract class GenericDAO<T> {

	
	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<CBOS> {
	
	@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());
		}

	}
}

O erro:

10:15:48,772 INFO [org.hibernate.event.internal.DefaultDeleteEventListener] (http--127.0.0.1-8080-1) HHH000114: Handling transient entity in delete processing

E se coloco o merge antes de remover ele tenta inserir e dá erro de duplicidade da chave.

Alguém já viu isso?

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.

tmvolpato

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

UpTheIrons

Opa, tô em outro local de trabalho, mas vamos lá…

O Id é preenchido manualmente.

E eu já tinha feito algo assim:

<blockquote>

public void removerCBOS(int id){

CBOS cbos = geCBOSById(id);

if(cbos != null){

getEntityManager().remove(cbos);

}  </blockquote>

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:

UpTheIrons

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!

Criado 1 de março de 2012
Ultima resposta 2 de mar. de 2012
Respostas 6
Participantes 3