Problema removendo item com EJB3

Comecei a estudar EJB3 agora, consegui incluir, alterar e consultar os objetos, mas na exclusão estou tomando o erro abaixo

java.lang.IllegalArgumentException: Removing a detached instance com.cliente.ejb.objeto.Cliente#1


@Entity
public class Cliente implements Serializable
{
    @Id @GeneratedValue 
	private int clienteId;
	private String nome;
	...
}

@Remote
public interface ClienteInterface
{
	public void excluir( Cliente cliente );
}

@Stateless
public class ClienteCadastrar implements ClienteInterface 
{
    @PersistenceContext 
    EntityManager entitymanager;

	public void excluir(Cliente cliente) {
		entitymanager.remove(cliente);
		
	}
}

tenho uma classe com o método main que executa o código abaixo

	public static void main(String[] args)
	{
		Hashtable prop = new Hashtable();
		
		prop.put(InitialContext.INITIAL_CONTEXT_FACTORY,
				"org.jnp.interfaces.NamingContextFactory");
		prop.put(InitialContext.PROVIDER_URL, "jnp://localhost:1099");
		
		Context ctx;
		try {
			ctx = new InitialContext(prop);
			ClienteInterface cad = (ClienteInterface) ctx.lookup("ClienteCadastrar/remote");

			Cliente c2  = new Cliente();
			c2.setId(1);
			
			cad.excluir(c2);

		} catch (NamingException e) {
			e.printStackTrace();
		}
	}

alguém sabe dizer o que estou fazendo de errado?

cheguei a achar que eu precisaria consultar o objeto antes de excluir, mas o erro continuava o mesmo

	Cliente c2  = new Cliente();
	c2.setId(1);

	c2 = cad.consultar(c2); // aqui ele retorna o objeto preenchido corretamente do banco

	cad.excluir(c2);

outra coisa que tentei foi colocar o ClienteCadastrar como Statefull mas o erro foi o mesmo também

[]s

Amigo seu objeto está no estado detached, para exclusão, inserção e alteração ele precisar estar no estado persistent… O objeto precisa estar numa sessão valida. Veja o descritivo abaixo sobre o estado Detached e para os outros estados.

Detached - a detached instance is an object that has been persistent, but its Session has been closed. The reference to the object is still valid, of course, and the detached instance might even be modified in this state. A detached instance can be reattached to a new Session at a later point in time, making it (and all the modifications) persistent again. This feature enables a programming model for long running units of work that require user think-time. We call them application transactions, i.e. a unit of work from the point of view of the user.

Transient - an object is transient if it has just been instantiated using the new operator, and it is not associated with a Hibernate Session. It has no persistent representation in the database and no identifier value has been assigned. Transient instances will be destroyed by the garbage collector if the application doesn’t hold a reference anymore. Use the Hibernate Session to make an object persistent (and let Hibernate take care of the SQL statements that need to be executed for this transition).

Persistent - a persistent instance has a representation in the database and an identifier value. It might just have been saved or loaded, however, it is by definition in the scope of a Session. Hibernate will detect any changes made to an object in persistent state and synchronize the state with the database when the unit of work completes. Developers don’t execute manual UPDATE statements, or DELETE statements when an object should be made transient.

Espero te ajudado…

Abraços
Wanderson 8)

ok, deixa eu ver se entendi…

um objeto Persistent eu poderia excluir,
o objeto Transient é quando eu, por exemplo, acabei de fazer "new Cliente()"
e o Detached é um que eu busquei do banco pelo entitymanager porém a seção “expirou” e ele não está mais associado com um objeto no banco, logo não posso exluir ele

se for isso, como eu faria esse objeto Detached virar Persistent para poder excluir ele?
eu teria que fazer o “entitymanager.find” no mesmo método que vou executar o remove para conseguir excluir?
ex:

public void excluir(Cliente cliente) {
		cliente = entitymanager.find(Cliente.class, cliente.getId());
		entitymanager.remove(cliente);
}

Galera tbm estou com o mesmo problema

Ja tentei das seguintes maneiras:

em.remove(MyClass) // nao rola
em.remove(em.find(MyClass.class, xyz)) // nao rola
em.remove(em.merge(MyClass)) // nao rola

Nenhuma deu certo… pois a primeira posso ate entender que e porque ele nao esta no escopo da sessao mais agora os outros depois de ter feito a busca ou depois de ter feito o merge ele ainda fala que ele nao consta la…

E toda vez que utilizo o em.consult(MyClass); ele informa false em todos os casos tbm…

Lembrando que o meu Bean e um Statefull… tentei o Statless e nada tbm

Minhas interfaces dao sao @Local

O que posso esta fazendo de errado? consigo fazer uma consulta, criar um novo e editar agora deletar num vai…

Comigo a sintaxe :
"
Objeto classe = em.find(Objeto.class,1);
em.remove(em.merge(classe));
em.flush();
"
rolou.

[quote=jrxxjr]Comigo a sintaxe :
"
Objeto classe = em.find(Objeto.class,1);
em.remove(em.merge(classe));
em.flush();
"
rolou.[/quote]
Isso tem que funcionar, evidentemente que o método find pode lançar uma exceção…