hibernateXcompositeID

Em uma tabela, tenho um campo que é chave, e que é da própria tabela, e um outro campo q é chave mas que é foreing key.Os dois formam minha chave composta. Quando eu deixo o campo que é foreing key no mapeamento como apenas <key-property> ele dá certo. Mas eu acho q o correto mesmo seria se ele fosse <key-many-to-one>, já que ele se refere a um campo de outra tabela. Mas quando eu mudo pra este tipo não dá certo…
O que pode estar acontecendo? Qual a forma correta de se usar <key-many-to-one>…os .java e hbm ???
AH e eu nao estou usando annotations e nem o plugin do eclipse…por favor…se puderem me dar exemplos sem os “arrobas”…rs

Não seria algo assim?

&lt;composite-id&gt; &lt;key-property name=&quot;chave&quot; column=&quot;chave&quot; /&gt; &lt;key-many-to-one name=&quot;estrangeira&quot; class=&quot;ClasseEstrangeira&quot; column=&quot;estrangeira&quot;/&gt; &lt;/composite-id&gt;

Assim não funciona? Qual o erro?

Assim mesmo que eu estou fazendo.
Será algum erro na implementação da ClasseEstrangeira? Você poderia me dar um exemplo de como fica a ClasseEstrangeiro (VO e DAO) ?
Obrigada!

acho que seria algo assim:

[code]public class ClasseEstrangeira{
private int id;
private String nome;
//get & set
}

public class OutraClasse{
private int id;
private ClasseEstrangeira estrangeira;
private String dado;
}

<class name="ClasseEstrangeira" table="estrangeiras">
<id name="id">
<generator class="native" />
</id>
<property name="nome" />
>

<class name="OutraClasse" table="outras">
<composite-id>
<key-property name="chave" column="chave" />
<key-many-to-one name="estrangeira" class="ClasseEstrangeira" column="estrangeira"/>
</composite-id>
<property name="dado" />
</class>[/code]

Qual o erro dá?

Eu estou fazendo exatamente assim!!!
Mas não tem um lance de que, quando usamos composite-ID, tem que ser feita uma classe representando apenas o composite-ID??? Acho que o meu erro está aí…nao estou sabendo fazer certo…
AH! O erro dá na hora em que eu clico no botão Inserir…o JSP que acusa o erro (Tomcat). A mensagem se refere a erro no mapeamento.

Ahh esqueci, as classe que usam composite-id devem ser serializaveis e implementar os metodos equals() e hashCode(). :oops:

Implementa aí…

Eu uso HashSet no caso na ClasseEstrangeira…faço assim:

Set outrasclasses = new HashSet()
//get e set para outrasclasses

Como assim implementar os métodos equals e HashCode?
A ClasseEstrangeira e OutraClasse devem ser serializable???

Veja:

[code]public class ClasseEstrangeira implements Serializable{
private int id;
private String nome;
//get & set

public boolean equals(Object obj){
if(!(obj instaceof ClasseEstrangeira)){
return false;
}

  ClasseEstrangeira ce = &#40;ClasseEstrangeira&#41; obj;
  return getId&#40;&#41;==ce.getId&#40;&#41;;

}

public int hashCode(){
return Integer.valueOf(getId()).hashCode();
}
}

public class OutraClasse implements Serializable{
private int id;
private ClasseEstrangeira estrangeira;
private String dado;

public boolean equals(Object obj){
if(!(obj instanceof OutraClasse)){
return false;
}

  OutraCasse oc = &#40;OutraClasse&#41; obj;
  return &#40;getId&#40;&#41;==oc.getId&#40;&#41;&amp;&amp;getEstrangeira&#40;&#41;.equals&#40;oc.getEstrangeira&#40;&#41;&#41;;

}

public int hashCode(){
return 37*(Integer.valueOf(getId()).hashCode()+getEstrangeira().hashCode());
}
}[/code]

Não sei se as implementações estão totalmente certas não, porque fiz rapido aqui, mas testa aí…

ps.: pra saber mais sobre equals() e hashCode():

http://mindprod.com/jgloss/hashcode.html

eu fiz exatamente o que vc falou.
Mas em OutraClasse…o q eu coloco como o id?
Esta OutraClasse é exatamente a que se refere à tabela com chave composta. Uma das chaves é um timestamp :dt_cadastro…e a outra chave é o id_usuario ( que vem da minha tabela estrangeira (usuario). Como q eu faço neste caso?
E me diga tambem onde eu vou utilizar este equals e hashcode…

Muito obrigada pela atenção dispensada…vc está sendo legal comigo

Nesse caso o que eu chamei de “id” é o seu dt_cadastro, é só substituir…

O metodo equals() você pode usar para saber se dois objetos são iguais…

ex.:

[code]OutraClasse o1 = new OutraClasse();
OutraClasse o2 = new OutraClasse();

if(o1.equals(o2)){
//os objetos são iguais
}else{
//os objetos são diferentes
}[/code]

O metodo hashCode() é usado para obter um codigo hash do objeto. E raramente é usado diretamente, quem usa muito isso são as coleções onde você coloca esse objeto, como um HashTable.

Nesse caso você não vai usar esses metodos, quem vai usar é o hibernate…

Mais detalhes em: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html

ahhh entendi !!!

só está me dando erro nesta linha:
seria o sinal ==mesmo ???
(getId()==oc.getId()&&getEstrangeira().equals(oc.getEstrangeira());

acho q estou chegando lá…

me diga uma coisa…no DAO como vou fazer para inserir os dados???

É o == mesmo, tente colocar as expressões entre parenteses…

No DAO é só você chamar o metodo save() de uma Session que ele vai salvar seu objeto…

ex.:

OutraClasse oc = new OutraClasse&#40;&#41;; //preenche com os dados Session sessao = sessionFactory.openSession&#40;&#41;; Transaction tsct = sessao.beginTransaction&#40;&#41;; sessao.save&#40;oc&#41;; tsct.commit&#40;&#41;; sessao.close&#40;&#41;;

concertei os parenteses…rssrrs

o erro agora está dando pq a minha chave Dt_cadastro pe timestamp.

public int hashCode(){
return 37*(Integer.valueOf(getDt_cadastro()).hashCode()+getUsuario().hashCode());

como eu faço no Integer.valueOf(getDt_cadastro() ??? se eu ter um getTime retorna um long e nao int…

My Goooooooddd rssrrs

É só tirar o Integer.valueOf()

ok…agora compilou.
Mas continua me dando o meeesmo erro no JSP…
Como seria a parte de código para eu inserir no banco justamente os campos referentes à chave composta? acho q é isto que está pegando…pq o meu DAO está igualzinho ao que vc mandou. E todo o código q vc me mandou eu implemente nos respectivos VO das classes OutraClasse e ClasseEstrangeira. Eu ainda acho q o q tá pegando é o DAO…

valeu mais uma vez

Qual o erro?

org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848)

Este erro…de tanto apanhar com minhas outras tabelas q nao sao chave composta e q estao todas dando certo, acontece quando existe erro no mapeamento.
Vou almoçar e jah volto…
Existem alguns exemplos em q se existe uma classe para o composite-id…por exemplo uma classe Chave cujo os atributos sao as colunas pk. Já ouviu falar algo sobre? Como eu poderia aplicar o q vc me passou nisto?

Isso não é aplicado a Hibernate, isso é em Entity Bean…

Esse erro que você postou não mostra o erro do Hibernate, pegue o erro completo e coloque aí…

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
org.apache.jsp.consulta_005fhist_005fusuario_jsp._jspService(consulta_005fhist_005fusuario_jsp.java:216)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)

Não está aparecendo erro nenhum de Hibernate aí não…

Tenta rodar isso fora desse JSP, em outra classe, uma aplicação Standalone, algo assim… pode rodar no debug tambem…