marcosharbs 7 de ago. de 2009
ta pera ai vc disse que tem dois campos que são chave primaria ai falou uma sendo chave primaria e a outra uma foreign key
para fazer chave primaria composta utilize esse estilo:
vc terá uma classe a qual seus atributos seroa as pk como o exemplo abaixo:
Note que a classe é anotada como @Embeddable
@Embeddable
public class NaturePK implements Serializable {
private int id ;
private int projectid ;
private static final long serialVersionUID = 1L ;
public NaturePK () {
super ();
}
public int getId () {
return this . id ;
}
public void setId ( int id ) {
this . id = id ;
}
public int getProjectid () {
return this . projectid ;
}
public void setProjectid ( int projectid ) {
this . projectid = projectid ;
}
@Override
public boolean equals ( Object o ) {
if ( o == this ) {
return true ;
}
if ( ! ( o instanceof NaturePK )) {
return false ;
}
NaturePK other = ( NaturePK ) o ;
return ( this . id == other . id ) && ( this . projectid == other . projectid );
}
@Override
public int hashCode () {
return this . id ^ this . projectid ;
}
}
E na sua classe que será o EntityBean vc terá uma associação com essa classe que contem as pk como abaixo:
Note que o atributo do tipo NaturePK está anotado como @EmbeddedId
@ Entity
public class Nature implements Serializable {
@ EmbeddedId
private NaturePK pk ;
//... demais atributos e metodos gets e sets
ai está um mpetodo de mapear chaves primarias composta com hibernate, de uma olhada sobre essa annotations que comentei ai em cima,
espero ter ajudado, abraço
IronJavaMan 7 de ago. de 2009
Cara, faz o seguinte dá uma olhada na especificação JPA, nela voce vai encontrar alguma coisa como a anotação chamada IdClass que ficara em uma classe onde sera responsável por criar e validar sua PK: ClientePK, sendo que essa classe deve atender alguns requisitos como: deve implementar Serializable, possuir um construtor sem argumentos e implementar os métodos equals( ) e hashCode( ). Logo após voce cria a classe Cliente tera as seguintes anotações @Entity pois esta será gerenciada pelo EntityManager e a anotação @IdClass (ClientePK.class) onde vc podera definir sua FK, acho que é isso qualquer coisa poste um trecho do código onde vc estar fazendo a persistência. Valew.
daniel.xp0 11 de ago. de 2009
Certo marcosharbs. Mas o Problema e o seguinte. Eu gostaria de fazer esse mapeamento no arquivo XML, pois eu utilizo o hibernate em outra linguagem e nao no java.
Sera que vc poderia me ajudar??
daniel.xp0 11 de ago. de 2009
A linguagem que eu utilizo e c# com Hibernate
segue o mapeamento e a classe modelo para vcs derem uma olhada.
Classe modelo Solicitação
namespace Flavios . Modelo
{
/// < summary >
/// Classe Modelo da Solicitação
/// </ summary >
[ Serializable ]
public class Solicitacao
{
int _Numero ;
public int Numero
{
get { return _Numero ; }
set { _Numero = value ; }
}
DateTime _Data ;
public DateTime Data
{
get { return _Data ; }
set { _Data = value ; }
}
string _Descricao ;
public string Descricao
{
get { return _Descricao ; }
set { _Descricao = value ; }
}
Funcionario _Funcionario ;
public Funcionario Funcionario
{
get { return _Funcionario ; }
set { _Funcionario = value ; }
}
private StatusSolicitacao _Status ;
public StatusSolicitacao Status
{
get { return _Status ; }
set { _Status = value ; }
}
private Departamento _Departamento ;
public Departamento Departamento
{
get { return _Departamento ; }
set { _Departamento = value ; }
}
private SubStatusSolicitacao _SubStatus ;
public SubStatusSolicitacao SubStatus
{
get { return _SubStatus ; }
set { _SubStatus = value ; }
}
private string _Categoria ;
public string Categoria
{
get { return _Categoria ; }
set { _Categoria = value ; }
}
private IList < SolicitacaoHistorico > _ListaHistorico ;
public IList < SolicitacaoHistorico > ListaHistorico
{
get { return _ListaHistorico ; }
set { _ListaHistorico = value ; }
}
}
}
Classe Modelo historico
namespace Flavios . Modelo
{
[ Serializable ]
public class SolicitacaoHistorico
{
private Solicitacao _Solicitacao ;
public Solicitacao Solicitacao
{
get { return _Solicitacao ; }
set { _Solicitacao = value ; }
}
private int _NumeroHistorico ;
public int NumeroHistorico
{
get { return _NumeroHistorico ; }
set { _NumeroHistorico = value ; }
}
private DateTime _Data ;
public DateTime Data
{
get { return _Data ; }
set { _Data = value ; }
}
private string _Observacao ;
public string Observacao
{
get { return _Observacao ; }
set { _Observacao = value ; }
}
private Funcionario _Funcionario ;
public Funcionario Funcionario
{
get { return _Funcionario ; }
set { _Funcionario = value ; }
}
public override bool Equals ( object obj )
{
SolicitacaoHistorico solicitacaoHistorico = obj as SolicitacaoHistorico ;
if ( this == obj )
return true ;
else if ( this != obj )
return false ;
else if ( this == solicitacaoHistorico )
return true ;
else if ( this . NumeroHistorico != solicitacaoHistorico . NumeroHistorico )
return false ;
else if ( this . Solicitacao . Numero != solicitacaoHistorico . Solicitacao . Numero )
return false ;
else return true ;
}
public override int GetHashCode ()
{
unchecked
{
int result ;
result = 11 * ( _NumeroHistorico . GetHashCode () + _Solicitacao . Numero . GetHashCode ());
return result ;
}
}
}
}
Mapeamento Solicitação (Arquivo XML)
<?xml version='1.0' encoding='utf-8' ?>
<hibernate-mapping xmlns= 'urn:nhibernate-mapping-2.2' default-access= 'field' >
<class
name= 'Solicitacao'
table= 'SolCadSe'
lazy= 'false' >
<id name= '_Numero'
column= 'SolNro' type= 'int' >
<generator class= 'increment' />
</id>
<property name= '_Data' type= 'DateTime'
column= 'SolData' />
<property name= '_Descricao' type= 'string'
column= 'SolMotivo' />
<many-to-one name= '_Departamento'
column= 'DptCod'
class= 'Departamento' />
<property name= '_Categoria' type= 'string'
column= 'SolCat' />
<many-to-one name= '_Funcionario'
column= 'SolQdfCod'
class= 'Funcionario' />
<property name= '_Status'
column= 'SolStatus' />
<property name= '_SubStatus'
column= 'SolPosicao' />
<bag name= '_ListaHistorico' cascade= 'save-update' generic= 'true' inverse= 'true' lazy= 'false' >
<key >
<column name= 'SolNro' />
</key>
<one-to-many class= 'SolicitacaoHistorico' />
</bag>
</class>
</hibernate-mapping>
Mapeamento Historico (Arquivo XML)
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns= 'urn:nhibernate-mapping-2.2' default-access= 'field' >
<class
name= 'SolicitacaoHistorico'
table= 'SOLDIA'
lazy= 'false' >
<id name= '_NumeroHistorico'
column= 'SolDiaNro' type= 'int' >
<generator class= 'hilo' />
</id>
<many-to-one name= '_Solicitacao'
column= 'SolNro' class= 'Solicitacao' />
<!--<composite-id>
<many-to-one name='_Solicitacao'
column='SolNro' class='Solicitacao'/>
<key-property name='_NumeroHistorico'
column='SolDiaNro' type='int'/>
</composite-id>-->
<!--<id name="_NumeroHistorico" column="SolDiaNro" type="int">
<generator class="increment"/>
</id>-->
<!--<composite-id>
<key-property name='_NumeroHistorico'
column='SolDiaNro' type='int'>
</key-property>
<key-many-to-one name='_Solicitacao'
column='SolNro' class='Solicitacao'>
</key-many-to-one>
</composite-id>-->
<property name= '_Data' type= 'DateTime'
column= 'SolDiaData' />
<property name= '_Observacao' type= 'string'
column= 'SolDiaObs' />
<many-to-one name= '_Funcionario'
column= 'SolDiaCodQ' class= 'Funcionario' />
</class>
</hibernate-mapping>
Lavieri 11 de ago. de 2009
wrong forum! … C# ?? o.O
com java, é do modo que o colega falou ali… é com @IdClass