Relacionamentos entre Entity Beans - CMP

3 respostas
M

Pessoal,
Como que funciona os relacionamentos entre beans de entidade usando CMP ?
Tentei fazer um modelo seguindo o exemplo do tutorial da sun, no exemplo do RosteApp (relacionamentos dos Beans Team, Player e League), mas nao tive muito sucesso.
por exemplo:
No meu banco eu tenho as tabelas Cidade e Estado.
Uma cidade só poder pertecencer a um Estado e um Estado pode ter várias Cidades.
Na minha aplicação de teste eu tenho um Bean Cidade, um Bean Estado e suas respectivas Interfaces Local e LocalHome, um Session Bean para gerenciamento do Entity Beans e o Cliente acessando o SessionBean.
Até aí beleza… tudo funcionando…
Agora gostaria de saber quais e como deve implementar os métodos para relacionamentos.
por exemplo, para que um determinado metodo, por exemplo: getCidadesDoEstado(uf), me traga dos a cidades pertencentes aquele estado (uf).
Vi também que no deploytool vc define os Beans que vão ter os relacionamentos, os tipos de relacionamento(1:* e etc) e o tipo de retorno (Collection …).

Acredito que meu problema é em relação aos métodos, pois no teste que eu fiz (baseado no exemplo da sun) ele sempre me retornava vazio.

Alguém tem alguma dica ou exemplo (sem ser o do tutorial da sun) ?

agradeço…

mindu

3 Respostas

Alexandre

Pra comecar, no ejb-jar.xml, vc define os relacionamentos,
vc deve definir os metodos de acesso de relecionamento nas interfaces(o ideal e, qnd vc trabalha com um session bean de fachada, implementar os entity beans com interfaces locais), e o nome desses metodos deve ser o mesmo do nome do campo de relacionamento definido no ejb-jar.xml.

No ejb-jar.xml

<ejb-relation>
			<ejb-relation-name>Estado-Cidade</ejb-relation-name>

			<ejb-relationship-role>
				<ejb-relationship-role-name>Estado-Tem-Cidades</ejb-relationship-role-name>
				<multiplicity>One</multiplicity>
				<relationship-role-source>
					<ejb-name>ejb/Estado</ejb-name>
				</relationship-role-source>
				<cmr-field>
					<cmr-field-name>cidades</cmr-field-name>
					<cmr-field-type>java.util.Set</cmr-field-type>
				</cmr-field>
			</ejb-relationship-role>

			<ejb-relationship-role>
				<ejb-relationship-role-name>Cidade-Pertence-Estado</ejb-relationship-role-name>
				<multiplicity>Many</multiplicity>
				<relationship-role-source>
					<ejb-name>ejb/Cidade</ejb-name>
				</relationship-role-source>
				<cmr-field>
					<cmr-field-name>estado</cmr-field-name>
				</cmr-field>
			</ejb-relationship-role>

Nas interfaces tem que definir metodos de acordo com os nomes do campo de relacionamento:

public set getCidades(); public Estado getEstado();

Se vc quiser acrescentar outros tipos de metodos de busca, como achar as cidades de um determinado estado, vc deve declarar metodos find no ejb-jar.xml, acrescentando na declaracao do entity bean:

<query>
		    	<query-method>
		    		<method-name>findCidadesByEstado</method-name>
		    		<method-params>
		    			<method-param>java.lang.String</method-param>
		    		</method-params>
		    	</query-method>
			    <ejb-ql><![CDATA[
			    	SELECT Object (c) FROM cidade c
			    	WHERE c.estado = ?1
			    ]]></ejb-ql>
		    </query>

ja que vc esta trabalhando com um session bean vc deve implementar os metodos que o cliente usarao, os metodos devem ser implementados a partir dos metodos declarados nas interfaces dos entity beans…

e isso…
qq duvida e so postar…
[]`s
Alexandre Martins.

M

Alexandre, não estou editando os xml diretamente, estou usando o deploytool que vem no j2sdkee, mas deu para ter uma noção do que vc esta querendo dizer.

Acho que consegui chegar até aí onde vc falou.

Veja:
Seguindo o exemplo que citei eu tenho:

  • CidadeBean
    metodo: LocalEstado getEst();
    setEst(LocalEstado est);
    -LocalCidad
    metodo: public LocalEstado getEst();

  • EstadoBean
    metodo: Collection getCid();
    setCid(Collection cid);
  • LocaEstado
    metodo: public Collection getCid();

no deploytool eu defino o relacionamento entre Cidade e Estado

— Bean A ------------------------------------------------------ Bean B —
EstadoBean ------------------------ 1:* ---------------------- CidadeBean
field referencing Bean B: cid --------------------------------- field referencing Bean A: est
field type: Collection

o SessionBean bem acessa esses metodos Locais do EntityBean.

algo como:

LocalEstado localEstado = localEstadoHome.findByPrimaryKey(uf);

Collection c = localEstado.getCid();

o problema é que esse metodo não me retorna nada.
Fiz esse exemplo baseado no exemplo do tutorial da sun, só que algo mais simples para fim de entendimento, mas não funciona.

M

Boa tarde Amigo, eu fiz algo bem parecido com isso, fiz acessar um entity bean acessar outro por uma interface local, me mande os ccodigos pra mim dar uma olhada. [email removido] . Flw

Criado 2 de maio de 2003
Ultima resposta 17 de jun. de 2006
Respostas 3
Participantes 3