EJB 3 com JPA

Ola colegas,
eu tenho um simples pergunta:

alguem aqui já conseguiu rodar bonitinho uma aplicaçao Client(desktop) fora do container EJB acessando um SessionBean remoto e esse SessionBean grava alguma informação no banco de dados via JPA?

obrigado. abraços.

Sim

Esse é o sakurai! Sempre suas respostas simples e objetivas.

vc teria como mostrar a maneira q vc fez isso…pq o q acontece comigo é o seguinte…estou utilizando glassfish como container ok e NetBeans como IDE…se eu criar no meu EJB uma classebean comum com os meus getters e setters referente aos campos do banco de dados e depois passar essa classe para o SessionBean que chamo para gravar os dados e esse SessionBean envia a classebean para um metodo de um DAO (com JDBC puro mesmo) dá td ok, sem problemas…mas a partir do momento que utilizo como minha classebean (utilizo os getters e setters dela) a minha classe @Entity e depois passo essa classe para o meu SessionBean que está como o meu Facade e o meu metodo create (persist) nao funciona…hora ele dá falta das libs do toplink mas aí eu ja add as libs e comeca a dar erro dizendo q nao encontrou meu sesssionbean…é muito estranho…vc ja teve esse problema colega?

ah, detalhe…se eu trabalhar com interface local e fizer um teste com uma página jsf funciona…mas com interface remota e o client fora do container na funciona, se estiver utilizando JPAcomo disse acima.

vou postar os erros:

se eu nao tiver as libs do toplink no meu client:
WARNING: “IOP00810257: (MARSHAL) Could not load class oracle.toplink.essentials.exceptions.DatabaseException”

depois que coloco as libs no meu client o erro aparece (abaixo em negrito)…eu sei q alguem vai falar q nao esta achando meu banco ou algo do tipo mas é meio estranho pq no meu persistence.xml estou usando um datasource e esse datasource conectar pelo netbeans…e o mesmo erro acontece se eu utilizar com um exemplo em MySQL.

Exception in thread “main” javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.RemoteException: null; nested exception is:
Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: org.firebirdsql.jdbc.FBDriver cannot be cast to javax.sql.DataSource

as classes:

package entity;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.Table;

@Entity
@Table(name = "TAB_MASTER")
@NamedQueries({})
public class TabMaster implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    @Column(name = "IDMASTER", nullable = false)
    private Integer idmaster;
    @Column(name = "NOME", nullable = false)
    private String nome;
    @Column(name = "IDADE")
    private Integer idade;

    public TabMaster() {
    }

    public TabMaster(Integer idmaster) {
        this.idmaster = idmaster;
    }

    public TabMaster(Integer idmaster, String nome) {
        this.idmaster = idmaster;
        this.nome = nome;
    }

    public Integer getIdmaster() {
        return idmaster;
    }

    public void setIdmaster(Integer idmaster) {
        this.idmaster = idmaster;
    }

    public String getNome() {
        return nome;
    }

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

    public Integer getIdade() {
        return idade;
    }

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

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idmaster != null ? idmaster.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof TabMaster)) {
            return false;
        }
        TabMaster other = (TabMaster) object;
        if ((this.idmaster == null && other.idmaster != null) || (this.idmaster != null && !this.idmaster.equals(other.idmaster))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entity.TabMaster[idmaster=" + idmaster + "]";
    }

}
package session;

import entity.TabMaster;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class TabMasterFacade implements TabMasterFacadeRemote {
    @PersistenceContext
    private EntityManager em;

    public void create(TabMaster tabMaster) {
        em.persist(tabMaster);
    }

    public void edit(TabMaster tabMaster) {
        em.merge(tabMaster);
    }

    public void remove(TabMaster tabMaster) {
        em.remove(em.merge(tabMaster));
    }

    public TabMaster find(Object id) {
        return em.find(entity.TabMaster.class, id);
    }

    public List<TabMaster> findAll() {
        return em.createQuery("select object(o) from TabMaster as o").getResultList();
    }

}
package session;

import entity.TabMaster;
import java.util.List;
import javax.ejb.Remote;


@Remote
public interface TabMasterFacadeRemote {

    void create(TabMaster tabMaster);

    void edit(TabMaster tabMaster);

    void remove(TabMaster tabMaster);

    TabMaster find(Object id);

    List<TabMaster> findAll();

}

Client:

package eaclientejb;

import entity.TabMaster;
import java.io.FileInputStream;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import session.TabMasterFacadeRemote;


public class Main {


    public static void main(String[] args)throws Exception{

        Context jndiContext = getInitialContext();
        Object ref = jndiContext.lookup("session.TabMasterFacadeRemote");        
        TabMaster tabMaster = new TabMaster();
        tabMaster.setNome("Thiago");
        tabMaster.setIdade(24);
        TabMasterFacadeRemote facade = (TabMasterFacadeRemote) 
                PortableRemoteObject.narrow(ref, TabMasterFacadeRemote.class);
        facade.create(tabMaster);
    }
    
    public static Context getInitialContext() throws Exception {
        Properties props = new Properties();
        props.load(new FileInputStream("jndi.properties"));
        return new InitialContext(props);
    }

}

obrigado, abraços.

olha só, alterei meu persistence.xml…tirei o datasource e deixei assim

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="pu">
        <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
        <class>entity.TabMaster</class>        
        <properties>
            <property name="toplink.jdbc.driver" value="org.firebirdsql.jdbc.FBDriver"/>
            <property name="toplink.jdbc.url" value="jdbc:firebirdsql:localhost/3050:/gdb/testeejb.fdb"/>
            <property name="toplink.jdbc.user" value="SYSDBA"/>
            <property name="toplink.jdbc.password" value="masterkey"/>
            <property name="toplink.logging.level" value="INFO"/>
        </properties>
    </persistence-unit>
</persistence>

e agora apareceu mais uma informacao no erro:

[b]
Exception in thread “main” javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.RemoteException: null; nested exception is:
Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: Connection could not be allocated because: java.net.ConnectException : Erro ao conectar no servidor ‘localhost’ porta ‘1527’. Recebida a mensagem: ‘Connection refused: connect’.

[/b]

ele ta procurando uma porta 1527 mas coloquei a 3050 do firebird no persistence.xml…nao entendo o q acontece.

deve ta errada a porta la no teu glassfish, la na aba Resources>JDBC>Connection Pools>suaConexao, veja se a tua propriedade “portNumber” está correta

olá aleeebr…nao existe essa propriedade na minha conexao la no glassfish…entrei direto no console e fui ate onde vc informou…existe um botao ping lá e quando cliquei nele deu o seguinte erro: org.firebirdsql.jdbc.FBDriver cannot be cast to javax.sql.DataSource

na propriedade Datasource Classname está org.firebirdsql.jdbc.FBDriver e em Resource Type: javax.sql.Datasource…é isso mesmo?

agora a propriedade pornumber nao existe…é neste caminho mesmo?

obrigado colega.

eu vi a conexão do MySql e la tem portNumber mas pra firebird nao precisa…mesmo assim eu adicionei a propriedade e coloquei o numero da porta mas o mesmo erro continua.

ok, acho que nao precisa mesmo entao, o que pode estar acontecendo entao é estar faltando o driver no domain do teu glassfish, pelo menos em mysql tem que por o .jar do driver JDBC na pasta “Sun\AppServer\domains\domain1\lib\ext”, nunca usei firebird, mas se tiver que usar driver deve ser a mesma coisa, tente isso e poste o que aconteceu

Olha eu fiz um exemplo como o seu para validar um modelo de arquitetura. Fiz a classe Main.java fora do container coloquei o os modelo com os ejbs no Container e funcionou no meu micro. Quando peguei o jar do cliente e coloquei em outra maquina para acessar nao funcionou de maneira nenhuma. Se alguem consegiu funcionar pode me informar de que libs precisam para o Cliente funcionar fora do container?