Mapeamento com duas Chave Primaria

5 respostas
daniel.xp0

Ola amigos, sou novo aqui no forum e gostaria de saber sobre hibernate.

Estou com um problema que e o seguinte:

Vou tentar explicar. Como que eu faço para poder mapear um uma tabela com duas chaves primaria. Sendo uma chave primaria e uma foren key?

Obs: não posso mudar a estrutura do banco.

5 Respostas

marcosharbs

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

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

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

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

wrong forum! … C# ?? o.O

com java, é do modo que o colega falou ali… é com @IdClass

Criado 7 de agosto de 2009
Ultima resposta 11 de ago. de 2009
Respostas 5
Participantes 4