Erro na Aplicação EJB - "... is not a known entity type"

Olá, pessoal! o/
Meu primeiro post aqui no fórum.
Estou desenvolvendo pela primeira vez uma aplicação EJB. Até agora fui me virando sozinho, mas agora me encontro em uma situação da qual não consigo sair.
O intuito é fazer uma locadora online, mas estou primeiro fazendo uma simples aplicação de cadastro de clientes p/ depois pensar em algo maior.
Depois que preencho o campo do nome do cliente, na página, a mesma me retorna a seguinte exceção…:

java.lang.IllegalArgumentException
Object: br.com.locadejb.beans.Cliente@1010ad7e is not a known entity type.

Eu estou usando:
NetBeans 6.5
GlassFish V2
Banco de Dados Oracle 11G

Código da minha entidade:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.locadejb.beans;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 *
 * @author thiago
 */
@Entity
@Table(name = "CLIENTE")
@NamedQueries({@NamedQuery(name = "Cliente.findAll", query = "SELECT c FROM Cliente c"), @NamedQuery(name = "Cliente.findByIdCliente", query = "SELECT c FROM Cliente c WHERE c.idCliente = :idCliente"), @NamedQuery(name = "Cliente.findByNome", query = "SELECT c FROM Cliente c WHERE c.nome = :nome"), @NamedQuery(name = "Cliente.findByRg", query = "SELECT c FROM Cliente c WHERE c.rg = :rg"), @NamedQuery(name = "Cliente.findByCpf", query = "SELECT c FROM Cliente c WHERE c.cpf = :cpf"), @NamedQuery(name = "Cliente.findByIdade", query = "SELECT c FROM Cliente c WHERE c.idade = :idade"), @NamedQuery(name = "Cliente.findByStatus", query = "SELECT c FROM Cliente c WHERE c.status = :status")})
public class Cliente implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID_CLIENTE")
    private Long idCliente;
    @Column(name = "NOME")
    private String nome;
    @Column(name = "RG")
    private String rg;
    @Column(name = "CPF")
    private String cpf;
    @Column(name = "IDADE")
    private Integer idade;
    @Column(name = "STATUS")
    private Boolean status;
    @JoinColumn(name = "ID_ENDERECO", referencedColumnName = "ID_ENDERECO")
    @ManyToOne
    private Endereco idEndereco;
    @OneToMany(mappedBy = "idCliente")
    private List<Locacao> locacaoList;

    public Cliente() {
    }

    public Cliente(Long idCliente) {
        this.idCliente = idCliente;
    }

    public Long getIdCliente() {
        return idCliente;
    }

    public void setIdCliente(Long idCliente) {
        this.idCliente = idCliente;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getRg() {
        return rg;
    }

    public void setRg(String rg) {
        this.rg = rg;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public Integer getIdade() {
        return idade;
    }

    public void setIdade(Integer idade) {
        this.idade = idade;
    }

    public Boolean getStatus() {
        return status;
    }

    public void setStatus(Boolean status) {
        this.status = status;
    }

    public Endereco getIdEndereco() {
        return idEndereco;
    }

    public void setIdEndereco(Endereco idEndereco) {
        this.idEndereco = idEndereco;
    }

    public List<Locacao> getLocacaoList() {
        return locacaoList;
    }

    public void setLocacaoList(List<Locacao> locacaoList) {
        this.locacaoList = locacaoList;
    }

    public Locacao addLocacao(Locacao locacao){
        getLocacaoList().add(locacao);
        locacao.setIdCliente(this);
        return locacao;
    }

    public Locacao removeLocacao(Locacao locacao){
        getLocacaoList().remove(locacao);
        locacao.setIdCliente(null);
        return locacao;
    }

}

Código da minha SessionBean:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.locadejb.sessions;

import br.com.locadejb.beans.Cliente;
import javax.ejb.Stateful;
import javax.ejb.Stateless;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;

/**
 *
 * @author thiago
 */
@Stateful
public class LocadoraSessionBean implements LocadoraSessionRemote, LocadoraSessionLocal {
    
    public EntityManagerFactory emf = Persistence.createEntityManagerFactory("Locadora");
    public EntityManager em = emf.createEntityManager();

    public EntityManager getEm() {
        return em;
    }

    public void setEm(EntityManager em) {
        this.em = em;
    }

    public Object persistObj(Object obj){
        em.getTransaction().begin();
        em.persist(obj);
        em.getTransaction().commit();
        em.close();
        return obj;
    }
}

Código do meu bean da camada web:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.locadweb.beans;

import br.com.locadejb.beans.Cliente;
import br.com.locadejb.sessions.LocadoraSessionBean;


/**
 *
 * @author thiago
 */
public class ClienteWeb {
    public LocadoraSessionBean lsb = new LocadoraSessionBean();
    public Cliente cliente = new Cliente();

    public ClienteWeb(){
        
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public LocadoraSessionBean getLsb() {
        return lsb;
    }

    public void setLsb(LocadoraSessionBean lsb) {
        this.lsb = lsb;
    }

    public String persistCliente(){
        lsb.persistObj(this.cliente);
        return "sucesso";
    }

    public void setAttributs(String nome){
        cliente.setNome(nome);
    }
}

Código do meu JSF onde dá o erro:

<?xml version="1.0" encoding="UTF-8"?>
<!--
    Document   : cliente
    Created on : 15/08/2009, 13:55:05
    Author     : thiago
-->

<jsp:root
    version="2.1"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:jsp="http://java.sun.com/JSP/Page"
    xmlns:webuijsf="http://www.sun.com/webui/webuijsf">
    <jsp:directive.page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"/>
    <head><title>Locadora MBC Vídeos</title></head>
    <f:view>
        <h1>Cadastro de Cliente</h1>
        <h:form>
            <h:inputText value="#{clienteWeb.cliente.nome}"/>
            <h:commandButton value="Cadastrar" action="#{clienteWeb.persistCliente}"/>
        </h:form>
    </f:view>
</jsp:root>

Então… Precisava saber o que se passa. É o meu primeiro contato com EJB e não consegui encontrar nenhuma ajuda, pesquisando pela internet a fora. >_<[/quote]

Fala ai meu, seja bem-vindo!!

então, pq vc não usa injecao de dependencia por anotação do EJB3 ?

ja q vc ja esta usando colocando @Statefull

Vamos lá:

oq eu acho se sua classe é DAO então é melhor deixar ela como @Stateless pois ela terá o mesmo estado
para qualquer cliente q acessar! Agora se você deixar @Statefull era vai ser criada no container toda vez
que vc chamar, e isso ira destruir sua performace!!

E com EJB vc nao precisa mais criar o Persistence.createEntityManagerFactory(“Locadora”);

vc cria um DataSource e coloca no deploy do JBoss e pela anotação @PersistenceContext vc injeta o EntityManager e com a
anotação @EJB vc injeta na sua MB.

exemplo:


//SessionBean

@Stateless
@Local(IFactoryDao.class)
public class FactoryDao implements IFactoryDao {

	@PersistenceContext
	private EntityManager entityManager;
}


//MB
public class RoleHandler implements Serializable {
	
	private static final long serialVersionUID = 8262655716689109256L;
	
	private Role role = new Role();
	private DataModel roles;

	@EJB
	private IFactoryDao factoryDao;
}

espero ter ajudado !!

flws

Humm… Certo…

Fiz o que você disse, mas agora a troca de página não está sendo efetuada e nem a gravação no banco.
Tem mais 3 códigos que eu num mostrei que é o persistence.xml, o faces-config.xml e o web.xml.
Acredito que o problema esteja em um desses 3.

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="Locadora" transaction-type="JTA">
    <jta-data-source>locadmbc</jta-data-source>
    <properties/>
  </persistence-unit>
</persistence>

faces-config.xml

<?xml version='1.0' encoding='UTF-8'?>

<faces-config version="1.2" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
    <managed-bean>
        <managed-bean-name>clienteWeb</managed-bean-name>
        <managed-bean-class>br.com.locadweb.beans.ClienteWeb</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>

    <navigation-rule>
        <navigation-case>
            <from-outcome>/</from-outcome>
            <to-view-id>/index.jsp</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>cliente</from-outcome>
            <to-view-id>/cliente.jsp</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>sucesso</from-outcome>
            <to-view-id>/sucesso.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>
</faces-config>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.validateXml</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.verifyObjects</param-name>
        <param-value>false</param-value>
    </context-param>
    <filter>
        <filter-name>UploadFilter</filter-name>
        <filter-class>com.sun.webui.jsf.util.UploadFilter</filter-class>
        <init-param>
            <description>O tamanho máximo de carregamento permitido em bytes.  Caso seja definido com um valor negativo, não há máximo.  O valor padrão é 1000000.</description>
            <param-name>maxSize</param-name>
            <param-value>1000000</param-value>
        </init-param>
        <init-param>
            <description>O tamanho (em bytes) de um arquivo carregado que, se for excedido, fará com que o arquivo seja gravado diretamente no disco em vez de armazenado na memória.  Arquivos menores ou iguais a esse tamanho serão armazenados na memória.  O valor padrão é 4096.</description>
            <param-name>sizeThreshold</param-name>
            <param-value>4096</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>UploadFilter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <init-param>
            <param-name>javax.faces.LIFECYCLE_ID</param-name>
            <param-value>com.sun.faces.lifecycle.PARTIAL</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>ExceptionHandlerServlet</servlet-name>
        <servlet-class>com.sun.errorhandler.ExceptionHandler</servlet-class>
        <init-param>
            <param-name>errorHost</param-name>
            <param-value>localhost</param-value>
        </init-param>
        <init-param>
            <param-name>errorPort</param-name>
            <param-value>24444</param-value>
        </init-param>
    </servlet>
    <servlet>
        <servlet-name>ThemeServlet</servlet-name>
        <servlet-class>com.sun.webui.theme.ThemeServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ExceptionHandlerServlet</servlet-name>
        <url-pattern>/error/ExceptionHandler</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ThemeServlet</servlet-name>
        <url-pattern>/theme/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.jsp</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    <error-page>
        <exception-type>javax.servlet.ServletException</exception-type>
        <location>/error/ExceptionHandler</location>
    </error-page>
    <error-page>
        <exception-type>java.io.IOException</exception-type>
        <location>/error/ExceptionHandler</location>
    </error-page>
    <error-page>
        <exception-type>javax.faces.FacesException</exception-type>
        <location>/error/ExceptionHandler</location>
    </error-page>
    <error-page>
        <exception-type>com.sun.rave.web.ui.appbase.ApplicationException</exception-type>
        <location>/error/ExceptionHandler</location>
    </error-page>
    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jspf</url-pattern>
            <is-xml>true</is-xml>
        </jsp-property-group>
        </jsp-config>
    <!--<ejb-local-ref>
        <ejb-ref-name>LocadoraSessionBean</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>
        <local-home>LocadoraSessionLocal</local-home>
        <local>LocadoraSessionLocal</local>
    </ejb-local-ref>-->
    </web-app>

Ah, e peço desculpas também. Eu disse que essa é o meu primeiro contato com ejb, mas não é. Na empresa onde estava estagiando, eu dei uma boa mexida nele, mas não absorvi informação o suficiente, pelo visto. Essa é a minha primeira aplicação sozinho.

então amigão vc tem q ter na pasta ser/default/deploy esse arquivo :

um nome ficticio meu: bancosql-ds.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE datasources
    PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
    "http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">
    
<datasources>
   
   <local-tx-datasource>
      <jndi-name>LivrariaDS</jndi-name>
      <connection-url>
		jdbc:postgresql://localhost/ejb3	
      </connection-url>
      <driver-class>org.postgresql.Driver</driver-class>
      <user-name>postgres</user-name>
      <password></password>
<!-- 
      <exception-sorter-class-name>
         org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
      </exception-sorter-class-name>
      <metadata>
         <type-mapping>mySQL</type-mapping>
      </metadata>
-->
   </local-tx-datasource>
    
</datasources>

ai no seu persistence.xml vc faz:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
	
	<persistence-unit name="livraria" transaction-type="JTA">
		<jta-data-source>java:/LivrariaDS</jta-data-source>
		<class>br.com.teste.entity.Usuario</class>
		<class>br.com.teste.entity.Cliente</class>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="true" />
		</properties>
	</persistence-unit>
	
</persistence> 

como vc esta usando o Jboss, vc tem q informar o prefixo java:/ antes do nome do seu DataSource!!!

espero ter ajudado !!!

Opa!
Desculpe a demora p/ vir aqui de novo. Tive algums entrevistas de emprego e viagem p/ ver a parentada no findi. Foi osso… >_<

Mas então…
Qual pasta é essa? “ser/default”??

Outro detalhe… Eu num estou usando o JBoss, hehehe… Como eu disse ali encima, estou usando o GlassFish V2, só que eu esqueci de dizer isso no outro post. Desculpa! Falha minha…

E brigadão pela ajuda desde já, rapá!

(outra coisa que esqueci de fazer no post anterior…)

vc tem q colocar o DataSource na pasta deploy do seu GlassFish!!!

eu mexi pouco com o GlassFish manjo mais do JBoss mesmo! xP

mais acho q é só colocar na pasta deploy que ele acha!!

Então… Eu fui dar uma olhada e o meu datasource já está “deployado”.
Agora o erro é outro, também… Quando dou um “cadastrar”, colocando apenas o nome do novo cliente, o sistema me retorna um NullPointer…:

Detalhes da exceção: javax.faces.FacesException
#{clienteWeb.persistCliente}: java.lang.NullPointerException

Possível origem de erro:
Nome da classe: com.sun.faces.application.ActionListenerImpl
Nome do arquivo: ActionListenerImpl.java
Nome do método: processAction
Número de linha: 107

Origem não disponível. Informações relativas à localização da exceção podem ser identificadas por meio do rastreamento da pilha de exeções abaixo.

Rastreamento da pilha:

com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:107)
com.sun.rave.web.ui.appbase.faces.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
javax.faces.component.UICommand.broadcast(UICommand.java:383)
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
com.sun.faces.extensions.avatar.lifecycle.PartialTraversalLifecycle.execute(PartialTraversalLifecycle.java:94)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:333)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
com.sun.webui.jsf.util.UploadFilter.doFilter(UploadFilter.java:267)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:313)
org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218)
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222)
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166)
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288)
com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647)
com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579)
com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831)
com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)

Eu pensei na possibilidade de ter algo a ver com o id, pois não estou passando nenhum id, só o nome do novo cliente, porém a minha tabela já possui uma sequence para auto-incrementar o id. Acho que num tem nada a ver com isso, mas não discarto a possibilidade de ter algo errado nisso.

Naquela hora, ele não estava mudando de página porque tinha mudado a ação do botão de “action” para “actionListener”, lá no meu código jsp.
E surge mais uma dúvida. Qual dos dois devo usar? Eu num lembro de já ter usado actionListener em uma aplicação minha, alguma vez.

Outra coisa!
Acho que ele está tentando persistir o cliente com ele estando null. Acho que esse é o erro, pois quando dou um “cadastrar”, ele tenta persistir o cliente, mas talvez aquilo que digitei no campo ainda não tenha ido para o meu atributo cliente.nome.
Eu depurei a aplicação e isso deixou mais nítido ainda, pois o cliente realmente está apontando um valor nulo.
E agora? Eu num lembro mesmo o que tem que ser feito nessa hora.

como vc fez o binding com o cliente ?

exemplo view:

<h:inputText id="itDescricao" required="true"	value="#{categoriaHandler.categoria.descricao}">
     <f:validateLength minimum="5" maximum="10" />
</h:inputText>

exemplo MB:

private Categoria categoria = new Categoria();

NÃO ESQUECE DE CRIAR O SET E GET PARA ELE!!

e o salvar

view:

<h:commandButton action="#{categoriaHandler.salvar}" value="Salvar" />

MB:

public String salvar() {
		daoFactory.getCategoria().salvar(categoria);
		System.out.println(categoria.getValor());
		categoria = new Categoria();
		return "listarCategorias";

	}	

espero q assim fique mais claro!!!

Eita… Aconteceu uma confusão aqui. ¬.¬
O que estava null, na verdade, não era o cliente. Era o objeto correspondente ao meu EntityManager (o em).
O @PersistenceContext parece não estar funcionando. Eu preciso usar o EntityManagerFactory para o em num ficar null, mas aí dá aquela exceção do começo do tópico.
Depurando a aplicação, eu vi que o valor dentro do meu atributo cliente, que corresponde a entidade Cliente, é um valor parecido com “br.com.locadejb.beans.Cliente@1010ad7e”. Só muda a numeração depois do “@”.
(gostaria de saber o que singnifica esse valor detalhadamente. se puder me ajudar nessa também… >_<)
Nisso, o sistema acusa que esse valor não é conhecido com uma entidade, o que p/ mim é meio esquisito. P/ mim, o que deveria ser conhecido como uma entidade era o cliente inteiro, e não o valor dentro de um de seus atributos (no caso, o atributo “nome”).

Ah, e aí vai o bind com o cliente.

No jsp:

MB:

Os Getters e Setters foram criados sim!

O cadastrar no JSP:

No MB:

public String persistCliente(){ lsb.persistObj(this.cliente); return "sucesso"; }

No SessionBean:

public void persistObj(Object obj){ em.getTransaction().begin(); em.persist(obj); em.getTransaction().commit(); em.close(); }

Valews! o/

achei o seu erro xD

se vc nao tiver usando a anotacao para vc manipular
a transacao, vc nao pode
usar a transacao explicitamente como vc esta
fazendo!!

public void persistObj(Object obj){   
    em.getTransaction().begin();   
    em.persist(obj);   
    em.getTransaction().commit();   
    em.close();   
}  

é so colocar:

this.em.persist(obj);

e a respoeito do codigo que mostra "br.com.locadejb.beans.Cliente@1010ad7e!!

isso é sanado se vc sobrescrever o toString na sua classe cliente, para mostrar por exemplo o id, ou o nome do cliente!

mais o erro do PersistenceContext acho q é por causa da Transaction msm!

tenta tirar e me fala!

se vc anotar na sua session bean

isso

@TransactionManagement(TransactionManagementType.BEAN)

ai sim vc pode colcoar transacoes explicitamente!

mais nao aconselho!! Aconselho vc deixar o container EJB fazer isso para vc!!!

exemplo de Session Bean simples:

@Stateless
@Remote(GerenciadorLoja.class)
@RemoteBinding(jndiBinding = "GerenciadorLojaBean")
public class GerenciadorLojaBean implements GerenciadorLoja {

	@PersistenceContext
	private EntityManager manager;

	@Override
	public Livro salva(Livro livro) {
		this.manager.persist(livro);
		System.out.println("Livro salvo! ID: " + livro.getId());
		return livro;
	}

	@Override
	public Autor salva(Autor autor) {
		this.manager.persist(autor);
		System.out.println("Livro salvo! ID: " + autor.getId());
		return autor;
	}

	@Override
	public Livro procura(Long id) {
		return this.manager.find(Livro.class, id);
	}

	@Override
	public List<Autor> getAutores(Livro livro) {
		this.manager.refresh(livro.getAutores());		
		return livro.getAutores();
	}

}

espero q ajude ! xD

Então… Agora que eu coloquei o toString na entidade, ao invés de aparecer aquele Cliente@numseioque, aparece aquilo que eu digitei no campo. Vamo supor que eu tenha digitado Cliente1. O erro que me retorna é que Cliente1 não é uma entidade conhecida, o que é muito estranho. Voltamos aquela questão de que o que deveria ser reconhecido como uma entidade, tinha que ser o objeto do tipo Cliente e não o valor do atributo cliente.nome. E outra… Não consegui localizar o erro relacionado ao @PersistenceContext. Mesmo eu tirando o os métodos de transação do EntityManager, ele ainda continua acusando que o meu ‘em’ tá nulo.
Eu ainda acho que isso tem a ver ou com o meu persistence.xml ou com o meu web.xml, ambos postados ali encima.
Mas também sinto que to aprendendo bastante uns macetes básicos fuçando essa aplicação.
Por enquanto, ainda não estou ficando desesperado, rs rs rs…

(a não ser por alguns problema que aconteceram com o meu pc de ontem p/ hoje. por isso que não consegui fazer mais nada nem vir aqui comentar as coisas… ¬.¬)

E mais uma vez, obrigado pela ajuda aew, Cherubini!

uma perguntinha basica!!!

qual banco vc ta usando?

e uma muito importante, vc colocu o jar do drive do jdbc do banco q vc esta usando na pasta
lib do Glassfish , neh?

ow glassfish vc tem q jogar todos os jars na pasta lib dele! se nao, nao funfa!!! xD

caso nao seja isso!! agente pensa em algo a mais! UIHEuiHEui

e q isso, to aprendendo bastante te ajudando! xD

Poutz, cara… Olha o que eu fiz p/ resolver o problema da exceção…
Fiz as duas coisas. Coloquei o @PersistenceContext e criei ele junto com um EntityManagerFactory, mas isso ainda me cheira a POG… ¬.¬
Agora tá indo p/a minha outra página, porém não tá gravando os dados no banco. Já fiz umas pesquisas em outros fóruns e num achei o problema, mas agora o meu persistence.xml tá assim…:

<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="Locadora" transaction-type="JTA"> <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider> <jta-data-source>locadmbc</jta-data-source> <properties> <property name="toplink.jdbc.driver" value="oracle.jdbc.OracleDriver"/> <property name="toplink.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:oramendoka"/> <property name="toplink.jdbc.user" value="XXXXX"/> <property name="toplink.jdbc.password" value="XXXXX"/> <property name="toplink.logging.level" value="INFO"/> </properties> </persistence-unit> </persistence>

Num sei porque num tá persistindo, agora. >_<
To me lascando todo, rs rs rs…

Bom como vc esta usando o DataSource vc nao pode declarar duas diretivas de banco no seu persistence.xml

olha tem q ser assim:

<?xml version="1.0" encoding="UTF-8"?>   
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">   
  <persistence-unit name="Locadora" transaction-type="JTA">   
    <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>   
    <jta-data-source>locadmbc</jta-data-source>   
    <properties>   
      <property name="toplink.jdbc.driver" value="oracle.jdbc.OracleDriver"/>   
     </properties>   
  </persistence-unit>   
</persistence>  

e o seu DataSource no deploy ta com esse nome locadmbc ,

pq se nao ele nao acha!!!

Hummm… Tendi!
Isso tava meio que na cara, mas eu num sei o que raios fez eu pensar que funcionaria do jeito que eu fiz, rs rs rs… Aiai, belo vacilo…

Mas então… Deixei o Persistence desse jeito. Agora, creio que o erro, na verdade, tá nesse meu sessionbean. Será que usando transação do tipo JTA eu posso realmente estar usando o EntityManager? Pesquisando por aí, eu acabei vendo que quem usa jta, faz umas coisas diferentes, mas não consegui entender o que tavam fazendo e nem sei se é realmente necessário fazer daquelas formas.
E eu num posso usar a transação do tipo “RESOURCE_LOCAL” porque parece que não é compatível com o glassfish. -_-’’

Vou p/a facul agora. Quando eu chegar, vou vasculhar mais um poko a internet e ver se é isso mesmo que acontece nessa joça, rs rs rs…

o/

tipo!!

com JTA vc usa um DataSource que vc cria no seu deploy do webserver(Glassfish)

exemplo DataSource(sql-ds.xml):

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE datasources
    PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
    "http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">
    
<datasources>
   
   <local-tx-datasource>
      <jndi-name>CoreWebDS</jndi-name>
      <connection-url>jdbc:postgresql://localhost/postgres</connection-url>
      <driver-class>org.postgresql.Driver</driver-class>
      <user-name>postgres</user-name>
      <password>bmxthg88</password>
<!-- 
      <exception-sorter-class-name>
         org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
      </exception-sorter-class-name>
      <metadata>
         <type-mapping>mySQL</type-mapping>
      </metadata>
-->
   </local-tx-datasource>
    
</datasources>

ai depois disso vc cria o persistence.xml na pasta META-INF do seu projeto EJB3 ou projeto base(projeto a onde ficar suas entity)
exemplo:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
	
	<persistence-unit name="padrao" transaction-type="JTA">
		<jta-data-source>java:/PadraoDS</jta-data-source>			
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />			
			
			 <!-- Other Hibernate's properties-->        
			<property name="hibernate.format_sql" value="true" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="true" />	
			
			 <!-- Connection Pool c3p0-->
			<property name="c3p0.acquire_increment" value="1" />
			<property name="c3p0.idle_test_period" value="100" />
			<property name="c3p0.max_size" value="50" />
			<property name="c3p0.max_statements" value="0" />
			<property name="c3p0.min_size" value="10" />
			<property name="c3p0.timeout" value="1800" />
			
		</properties>
	</persistence-unit>
	
</persistence> 

depois de ter feito esses dois passos vc cria sua SessionBean stateless desse jeito
exemplo

//Interface local

public interface IFactoryDao {

	 IUserDao getUserDao();

}

//Session bean q usa interface local
@Stateless
@Local(IFactoryDao.class)
public class FactoryDao implements IFactoryDao {

	@PersistenceContext
	private EntityManager entityManager;

	@Override
	public UserDao getUserDao() {
		return new UserDao(this.entityManager);
	}

}

feito isso é so injetar no seu MB:

exemplo:

public class UserHandler implements Serializable {

	private static final long serialVersionUID = -8102640556625985914L;

	private User user = new User();

	private DataModel users;

	private boolean rememberMe;

	@EJB
	private IFactoryDao factoryDao;

	// TODO Metodo para tirar warning, metodo sera removido
	public String salvar() {
		this.factoryDao.getUserDao().salva(user);
		return "";
	}
}

bom, esses são o povo para cuso de EJB!!!

espero q agora fique mais claro ! xD

abraços