Erro ao inserir dados num Entity Bean com relacionamentos

6 respostas
R

ola pessoal, bom dia!

galera eu tenho um bean que possui 4 relacionamentos com outros beans (CMP, JBOSS)

porem na hora que eu vo inserir um novo dado nesse meu bean principal,da o seguinte erro:

esse meu bean principal recebe como parametro campos relacionados a ele e a Interface Local dos outros beans relacionados.
porem desses beans relacionados so consigo inserir 2 deles os outros 2 dao esse erro que coloquei acima. Todos possuem relacionamentos 1-1 unidirecional.

alguem poderia me ajudar???

6 Respostas

Alexandre

Você ja verificou o que você está passando para este campo?
Pelo erro, ele espera um objeto, ou um dado primitivo, e você está enviando
um conjunto, como uma Collection ou Set.

Dah uma olhadinha.

R

Oi alexandre.
tenho certeza de que estou pasando Objetos.
vou postar aqui meu AmostraBean, que eh o entity bean que possui os relacionamentos

package siotmd.ejb;

import javax.ejb.*;
import siotmd.vo.*;
import siotmd.ejb.OracleSequenceHome;
import siotmd.ServiceLocator;
import siotmd.ServiceLocatorException;
import siotmd.exception.SiotmdException;
import javax.ejb.RemoveException;
import java.rmi.RemoteException;
import java.sql.*;
import siotmd.util.Funcoes;

abstract public class AmostraBean implements EntityBean {
  EntityContext entityContext;

  public abstract void setIdentificador(int identificador);
  public abstract int getIdentificador();

  public abstract void setLacre(int lacre);
  public abstract int getLacre();

  public abstract void setQuantidade(double quantidade);
  public abstract double getQuantidade();

  public abstract void setDate(java.sql.Timestamp date);

  public abstract void setProduto(siotmd.ejb.Produto produto);
  public abstract void setRecipiente(siotmd.ejb.Recipiente recipiente);
  public abstract void setEstocagem(siotmd.ejb.Estocagem estocagem);
  public abstract void setTanque(siotmd.ejb.Tanque tanque);
  public abstract void setNavio(siotmd.ejb.Navio navio);

  public abstract java.sql.Timestamp getDate();


  public abstract siotmd.ejb.Produto getProduto();
  public abstract siotmd.ejb.Recipiente getRecipiente();
  public abstract siotmd.ejb.Estocagem getEstocagem();
  public abstract siotmd.ejb.Tanque getTanque();
  public abstract siotmd.ejb.Navio getNavio();


  public AmostraBean(){
  }

  public AmostraPK ejbCreate(int lacre, double quantidade, java.sql.Timestamp date, Produto produto, Recipiente recipiente, Tanque tanque, Navio navio, Estocagem estocagem) throws CreateException {
    System.out.println("AmostraBean ejbCreate: iniciando...");

    OracleSequence oracleSequence;
    Class homeClass = OracleSequenceHome.class;

    try {
      System.out.println("Localizando OracleSequence...");
      OracleSequenceHome home = (OracleSequenceHome) ServiceLocator.getInstance().
      getHome("OracleSequence", homeClass);
      System.out.println("OracleSequence localizado...");
      System.out.println("Criando OracleSequence...");
      oracleSequence = home.create();
      System.out.println("OracleSequence criado...");
      int identificador = oracleSequence.getNextSequenceNumber("SEQ_AMOS");
      System.out.println("Novo identificador = " + identificador);
      System.out.println(" -- "+ produto.getIdentificador() + " -- "+ produto.getNomeCompleto());
      setIdentificador(identificador);
    }
    catch (ServiceLocatorException e) {
      throw new CreateException(e.getMessage());
    }
    catch (RemoteException e) {
      throw new CreateException(e.getMessage());
    }
    catch (CreateException e) {
      throw new CreateException(e.getMessage());
    }
    catch (FinderException e) {
      throw new CreateException(e.getMessage());
    }

    setDate(date);
    setLacre(lacre);
    setQuantidade(quantidade);
    return new AmostraPK(getIdentificador());
  }


  public AmostraVO getData() {
    /**@todo Complete this method*/
    System.out.println("AmostraBean : getData() called.");
    AmostraVO amostraVO = new AmostraVO();
    amostraVO.setIdentificador(getIdentificador());
    amostraVO.setLacre(getLacre());
    amostraVO.setQuantidade(getQuantidade());
    amostraVO.setDate(getDate());

    try{


        amostraVO.setNavio(getNavio().getData());

        amostraVO.setEstocagem(getEstocagem().getData());

        amostraVO.setProduto(getProduto().getData());

        amostraVO.setRecipiente(getRecipiente().getData());

        amostraVO.setTanque(getTanque().getData());


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

    System.out.println("AmostraBean : Setou o amostraVO");

    return amostraVO;
  }


  public void ejbPostCreate(int lacre, double quantidade, java.sql.Timestamp date, Produto produto, Recipiente recipiente, Tanque tanque, Navio navio, Estocagem estocagem) throws CreateException {
    System.out.println("ejbPostCreate : called");

    setRecipiente(recipiente);
    System.out.println("seto recipiente");
    
    setTanque(tanque);
    System.out.println("seto tanque");


   /**************O ERRO OCORRE AQUI***********************/ 
   setProduto(produto);
    System.out.println("seto produto");

    setNavio(navio);
    System.out.println("seto navio");
    
      setEstocagem(estocagem);
    System.out.println("seto estocagem");


    /**@todo Complete this method*/

  }
  public void ejbRemove() throws RemoveException {
    /**@todo Complete this method*/
  }

  public void ejbLoad() {
    /**@todo Complete this method*/
  }
  public void ejbStore() {
    /**@todo Complete this method*/
  }
  public void ejbActivate() {
    /**@todo Complete this method*/
  }
  public void ejbPassivate() {
    /**@todo Complete this method*/
  }
  public void unsetEntityContext() {
    this.entityContext = null;
  }
  public void setEntityContext(EntityContext entityContext) {
    this.entityContext = entityContext;
  }
}

esses parametros Produto, Tanque... extendem de EJBLocalObject.

no ejbPostCreate ele so consegue inserir os 2 primeiros depois da aquele mesmo erro.

nao sei o que pode ser. :cry:

Alexandre

Bem seu código parece certinho.
O que você tem que fazer é debugar, vendo o q vc esta passando, o q ele
espera, etc…

Uma alternativa tb, é setar os relacionamentos fora do postCreate, tipo
fazer isso numa fachada.

falow.

R

oi Alexandre,
entendi o que vc quis dizer, ams estou fazendo exatamente isso.

olha o codigo do meu Facade:

public void addAmostra(int lacre, double quantidade, java.sql.Timestamp date, String pkProduto , int pkRecipiente, String pkTanque, String pkTanque2, String pkNavio, int pkEstocagem) throws CreateException, FinderException { amostraHome.create(lacre, quantidade, date, produtohome.findByPrimaryKey(new ProdutoPK(pkProduto)), recipientehome.findByPrimaryKey(new RecipientePK(pkRecipiente)), tanquehome.findByPrimaryKey(new TanquePK(pkTanque,pkTanque2)), naviohome.findByPrimaryKey(new NavioPK(pkNavio)), estocagemhome.findByPrimaryKey(new EstocagemPK(pkEstocagem))); //amostraHome.create(amostraVO); }

esta tudo funcionando certo, nenhum deles sao nulos pois eu ja testei.
todos eles voltar o identificador e os campos corretamente.
so que so 2 deles (Tanque e Recipiente) inserem, os outros dao o aquele erro.

coisa de doido :cry:

N

Ae reinaldo,

Quando você tem relacionamento múltiplo, você tem uma Collection em uma das pontas, quando você quer incluir uma entidade nesse relacionamento o que você quer realmente fazer é adicionar um item na Collection.

Então, adiciona um item na collection e vai funcionar.

Você está utilizando interfaces locais ou remotas (EJBObject ou EJBLocalObject) ?

No seu caso, eu faria como o Alexandre comentou, colocar a associação em uma fachada.

Boa sorte

R

Oi Sandro,

Sando, os relacionamentos nao sao multiplos, sao de 1-1

e as interfaces sao EJBLocalObject.

agora uma coisa que vc falou eu não entendi:

Como eu colocaria as associações no Facade??

alguem me ajude!!!

Criado 17 de junho de 2004
Ultima resposta 22 de jun. de 2004
Respostas 6
Participantes 3