Mapeamento de chave composta [RESOLVIDO]

6 respostas
zepunk

Olá pessoal, eu não estou conseguindo fazer um mapeamento com relacionamento MnyToMany com atributos, usando Annotations.

Tenho as seguintes tabelas:

------Veiculo------
-- idVeiculo(PK) --
-- placa            --
-- chassi           --
--------------------


-------Leilao------
-- idLeilao(PK) --
-- data            --
-------------------


------LeilaoVeiculo-----
-- idVeiculo (PK,FK)  --
-- idLeilao (PK,FK)    --
-- valor                   --
-- comitente            --
--------------------------

Agora estou um pouco perdido no mapeamento dessas classes pois é um mapeamento ManyToMany com atributos.

Obrigado pela atenção.

6 Respostas

passos

Quando vc tem uma tabela de relacionamento com atributos ela deixa de ser apenas uma tabela de relacionamento e passa a fazer parte do seu dominio. Ao meu ver vc vai ter que mapear essa tabela como uma classe e nao como um relacionamento many-to-many

J

Sugiro considerar a possibilidade de OneToMany de Veiculo para LeilaoVeiculo e de Leilao para LeilaoVeiculo.

C

Veio acredio que seus arquivos de mapeamentos devem estar mais ou menos asim:

<hibernate-mapping>

   <class name="Veiculo">

       <id name="idVeiculo">
	   <generator class="increment"/>	
       </id>

       <property name="placa"/>
       <property name="chassi"/>

   </class>

</hibernate-mapping>



<hibernate-mapping>

   <class name="Leilao">

      <id>
         <generator class="assigned"/>
      </id>

      <property name="data"/>

   </class>

</hibernate-mapping>



<hibernate-mapping>

    <class name="LeilaoVeiculo">

        <property name="valor"/>
        <property name="comitente"/>

        <many-to-one name="idVeiculo" class="Veiculo" lazy="false"/>
        <many-to-one name="idLeilao" class="Leilao" lazy="false"/> 

    </class>
  

</hibernate-mapping>
zepunk

Bom pessoal, infelizmente não estou conseguindo fazer o mapeamento.
Creio eu que um relacionamento ManyToMany não daria certo, pois eu preciso de uma entidade intermediária com atributos.

Estou usando Annotations mas tentei fazer este mapeamento do clauber.ferreira porém não deu certo. Estou pesquisando mas não estou conseguindo achar.

zepunk

Funçando pela documentação consegui fazer este mapeamento. Obridado pela ajuda de todos.

Veiculo

@Entity
@Table(name="tblVeiculo")
public class Veiculo {
	
	@Id
	@GeneratedValue
	@Column(name="ID_VEICULO")
	private Integer id;
	
	@Column(name="CD_PLACA")
	private String placa;
	
	@OneToMany(cascade = CascadeType.ALL, mappedBy="veiculo")
	@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	private List&lt;LeilaoVeiculo&gt; leilaoVeiculo;
	
}

Leilao

@Entity
@Table(name="tblLeilao")
public class Leilao {

	
	@Id
	@GeneratedValue
	@Column(name="ID_LEILAO")
	private Integer id;
	
	
	@Column(name="DS_DATA_LEILAO")
	private String dataLeilao;
	
	
	@OneToMany(mappedBy="leilao", cascade= CascadeType.ALL)
	@Cascade(value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	@Fetch(FetchMode.SUBSELECT)
	private List&lt;LeilaoVeiculo&gt; leilaoVeiculo;
}

LeilaoVeiculo (onde estava todo o problema)

@Entity
@org.hibernate.annotations.Entity(mutable=false)
@Table(name="tblLeilaoVeiculo")
public class LeilaoVeiculo {

	@Embeddable
	public static class Id{
		
		@Column(name="ID_VEICULO")
		private Integer veiculoId;
		
		@Column(name="ID_LEILAO")
		private Integer leilaoId;
		
		@Override
		public boolean equals(Object arg0) {
			
			if(arg0 instanceof Id) {
				Id that = (Id) arg0;
				return this.veiculoId.equals(that.veiculoId) && this.leilaoId.equals(that.leilaoId);
			}
			return false;
		}
		
		@Override
		public int hashCode() {
			// TODO Auto-generated method stub
			return veiculoId.hashCode() + leilaoId.hashCode();
		}
	}
	
	@EmbeddedId
	private Id id;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name="ID_LEILAO", insertable = false, updatable = false)
	@ForeignKey(name="FK_LEILAOVEICULO_LEILAO_ID")
	private Leilao leilao;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name="ID_VEICULO", insertable = false, updatable = false)
	@ForeignKey(name="FK_LEILAOVEICULO_VEICULO_ID")
	private Veiculo veiculo;

	@Column(name="DS_NOME")
	private String nome;
	
}

Novamente, Obrigado a todos.

jefferson.chaves

[quote=zepunk]Funçando pela documentação consegui fazer este mapeamento. Obridado pela ajuda de todos.

Éderson!

Estou exatamente com o mesmo problema que você já teve.
Eu entendi a solução usada, mas não sei nada de annotations e por isso não tenho a
mínima idéia de como a solução seria implementada usando os mapeamentos convencionais
do hibernate.

Você pode me dizer pelo menos como ficaria o mapeamento da tabela ?LeilaoVeiculo??

Valew…

Criado 25 de janeiro de 2007
Ultima resposta 30 de jan. de 2008
Respostas 6
Participantes 5