CMR ejbPostCreate()

6 respostas
J

Pessoal,

tenho dois CMP EJB que representam as duas tabelas relacionadas PAI e FILHO

Meu método ejbCreate() e ejbPostCreate() do EJB Filho ficaram assim:

public java.lang.Long ejbCreate( String nome, PaiLocal pai ) throws javax.ejb.CreateException {

setNome( nome );

return null;

}
public void ejbPostCreate( String nome, PaiLocal pai ) throws javax.ejb.CreateException {

setSite( site );

}

O problema é que isso não funciona se minha chave estrangeira na tabela (FILHO.CODPAI) é NOT NULL. Ele retorna a seguinte exception:
Could not create entity
java.sql.SQLException: General error, message from server: “Column ‘CODPAI’ cannot be null”

Se eu tiro essa constraint, com o campo permitindo NULL, funciona tudo perfeitamente.
Alguém sabe como corrigir isso? Não posso deixar o campo como NOT NULL no banco.

[]'s
João

6 Respostas

TedLoprao

Posso estar falando besteira, mas até onde sei a definição CMP não permite isso!!! Entretanto a maioria dos containers implementa soluções próprias para esse problema!!!
Ou seja, a resposta depende do servidor de aplicação que vc está usando!!!

Fallow

cv1

…que, por sinal, qual é?

J

Eu estou usando JBoss.
Eu achei em alguns foruns uma solução para Weblogic.
Tem uma configuração dele que você pode por:
<delay-database-insert-until>ejbPostCreate</delay-database-insert-until>
Ou seja, ele só dá o INSERT no banco depois do ejbPostCreate.

Tem alguma coisa do tipo no JBoss?

Obrigado
João

TedLoprao

Dá uma olhada no fórum do JBoss, parece que tem uma versão que tu podese fazer a seguinte configuração:

&lt;container-configurations&gt; 
      &lt;container-configuration extends="Standard CMP 2.x EntityBean"&gt; 
        &lt;container-name&gt;INSERT after ejbPostCreate Container&lt;/container-name&gt; 
        &lt;insert-after-ejb-post-create&gt;true&lt;/insert-after-ejb-post-create&gt; 
      &lt;/container-configuration&gt; 
    &lt;/container-configurations&gt;

Entretanto, não me lembro a versão do JBoss que era necessária para essa configuração funcionar!!!
Outra opção que tbm achei lá no fórum do JBoss foi criar a constraints como DEFERRABLE (ou algo parecido), onde a constraint só faz a validação após o fim da sessão!!!
Mas tbm não cheguei a testar, a solução que acabei usando foi utilizar BMP mesmo para não ficar preso ao JBoss!!!

Fallow

J

Obrigado Rodrigo,

eu também tinha encontrado essa solução, porém esbarrei num outro problema.
Eu estou usando mySQL, com a chave primária com auto_increment.
Pelo que eu achei num fórum, o container precisa saber a chave primária após chamar o ejbCreate e antes de chamar o ejbPostCreate… ou seja, ele tem que dar o INSERT no ejbCreate mesmo.

Vou tentar achar mais coisas, mas obrigado pela ajuda.

[]'s
João

H

Olá a todos,
Eu tb estou passando pelo mesmo problema , estou usando firebird e o JBOSS 3.2, alguém ja descobriu um maneira de contornar esse problema?
Com relação a essa configuração mostrada anteriorente onde devo coloca-la?
[]’

Criado 12 de novembro de 2003
Ultima resposta 16 de nov. de 2003
Respostas 6
Participantes 4