Hibernate Annotations - ManyToMany com atributos

Olá, quero fazer um mapeamento de many to many, porém a tabela associativa tem atributos.

Tenho uma tabela material e tenho uma tabela fabricante, dai a tabela associativa material_fabricante, além das fks cod_material e cod_fabricante, que também são pks. tem mais 2 atributos como codigo_barras e flg_padrao_cobranca.

eu consegui mapear o many to many normal, com tabela associativa porém sem nenhum atributo. Os abributos dessa tabela associativa eu não tenho ideia de como adicionar no relacionamento.

alguem poderia me ajudar?

grato,
thiago

bom terminei achando uma forma de fazer isso, em um post , no forum do hibernate, que um cara pos direcionado para o blogue dele.

http://java-aap.blogspot.com/2006/04/hibernate-annotations-composite.html#links

Não sei se é a melhor forma.

Thiagoaos, segui esse turorial que você postou, mas não consegui coloicar pra funcionar, esta seguindo o mesmo principio do tutorial, porem o compilador esta reclamando. O modelo é um relacionamento ManyToMany entre Produto e Loja, na tabela associativa, alem das chaves temos os atributos preço e data. O primeiro erro que da é quando ele reclama da anotação @Id em ProdutoLoja, ele diz que a coluna produtoLojaId não pode ser achada na tabela produtoLoja, realmente nao existe o id esta na classe ProdutoLojaId. Alterando a anotação para @EmbeddedId o erro desaparece, mas o compilador da erro na linha “@OneToMany(mappedBy=“produtoLojaId.produto”, targetEntity=ProdutoLoja.class)” em Produto.java. O apresentado é de que o mappedBy especificado para lstProdutoLoja não existe na entidade alvo.

Produto.java

@Entity
@Table(name=“produto”,catalog=“homecontrol”)
public class Produto implements java.io.Serializable {

// Fields    
private static final long serialVersionUID = 1L;

@Id
@Column(name="PK_PRODUTO", unique=false, nullable=false, insertable=true, updatable=false)
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Integer pkProduto;

private String nome;
private String descricao;

@OneToMany(mappedBy="produtoLojaId.produto", targetEntity=ProdutoLoja.class)
private List<ProdutoLoja> lstProdutoLoja;

... getters and setters

ProdutoLoja.java

@Entity
@Table(name=“produto_loja”,catalog=“homecontrol”)
public class ProdutoLoja implements java.io.Serializable {

 private static final long serialVersionUID = 1L;

 @EmbeddedId
 private ProdutoLojaId produtoLojaId = new ProdutoLojaId();
 
 @SuppressWarnings("unused")    
 @Column(name="FK_PRODUTO", nullable=false, updatable=false, insertable=false)
 private Produto produto;  
 
 @SuppressWarnings("unused")    
 @Column(name="FK_LOJA", nullable=false, updatable=false, insertable=false)
 private Loja loja; 
 
 @Temporal(TemporalType.DATE)
 @Column(name="DATA", unique=false, nullable=false, insertable=true, updatable=true, length=0)
 private Date data;
 
 @Column(name="PRECO", unique=false, nullable=false, insertable=true, updatable=true, precision=10)
 private Double preco;

 public Produto getProduto() {
	return produtoLojaId.getProduto();
}


public void setProduto(Produto produto) {
	produtoLojaId.setProduto(produto);
}


public Loja getLoja() {
	return produtoLojaId.getLoja();
}

public void setLoja(Loja loja) {
	produtoLojaId.setLoja(loja);
}
... getters and setters

ProdutoLojaId.java

@Embeddable
public class ProdutoLojaId implements java.io.Serializable {

// Fields    

 @ManyToOne(cascade = {CascadeType.MERGE}, fetch=FetchType.EAGER)
 private Loja loja;
 
 @ManyToOne(cascade = {CascadeType.MERGE}, fetch=FetchType.EAGER)
 private Produto produto;
 
// Constructors

/** default constructor */
public ProdutoLojaId() {
}


/** full constructor */
public ProdutoLojaId(Produto produto, Loja loja) {
    this.loja = loja;
    this.produto = produto;
}


// Property accessors

@Column(name="FK_LOJA", unique=false, nullable=false, insertable=true, updatable=true)

public Loja getLoja() {
    return this.loja;
}

public void setLoja(Loja loja) {
    this.loja = loja;
}

@Column(name="FK_PRODUTO", unique=false, nullable=false, insertable=true, updatable=true)

public Produto getProduto() {
    return this.produto;
}

public void setProduto(Produto produto) {
    this.produto = produto;
}

public boolean equals(Object other) {
    if ( (this == other ) ) return true;
	 if ( (other == null ) ) return false;
	 if ( !(other instanceof ProdutoLojaId) ) return false;
	 ProdutoLojaId castOther = ( ProdutoLojaId ) other; 
    
	 return ( (this.getLoja()==castOther.getLoja()) || ( this.getLoja()!=null && castOther.getLoja()!=null && this.getLoja().equals(castOther.getLoja()) ) )

&& ( (this.getProduto()==castOther.getProduto()) || ( this.getProduto()!=null && castOther.getProduto()!=null && this.getProduto().equals(castOther.getProduto()) ) );
}

public int hashCode() {
int result = 17;

    result = 37 * result + ( getLoja() == null ? 0 : this.getLoja().hashCode() );
    result = 37 * result + ( getProduto() == null ? 0 : this.getProduto().hashCode() );
    return result;

}

}

Pessoal, alguem consegue me dar uma luz ? ta compliado, mudei varias coisas e sempre tem algum problema, to achando ruim demais isso, com hbm era mole mole fazer esse tipo de coisa …

A essa altura vc já deve ter encontrado a solução, mas vou deixar postado aqui a solução que encontrei.

package negocio;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;

@Entity
public class Cliente {

@Id 
@GeneratedValue
private int id;

private String nome;
private String telefone;

@OneToMany(mappedBy="cliente", targetEntity=EmpresaCliente.class)    
private List empresaClienteItens = new ArrayList(); 


// getts e setts

}
package negocio;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Empresa {

@Id
@GeneratedValue
private int id;

@OneToMany(mappedBy="empresa", targetEntity=EmpresaCliente.class)    
private List empresaClienteItens = new ArrayList(); 

private String nome;
private String cgc;

            // getts e setts

}

package negocio;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.ManyToOne;

@Entity
public class EmpresaCliente {

@Id 
private EmpresaClientePK primaryKey = new EmpresaClientePK();

@SuppressWarnings("unused")    
@Column(name="cliente_id", nullable=false)    
private int cliente;

@SuppressWarnings("unused")    
@Column(name="empresa_id", nullable=false)    
private int empresa;

public Cliente getCliente() {
	return primaryKey.getCliente();
}

public void setCliente(Cliente cliente) {
	primaryKey.setCliente(cliente);
}

public Empresa getEmpresa() {
	return primaryKey.getEmpresa();
}

public void setEmpresa(Empresa empresa) {
	primaryKey.setEmpresa(empresa);
}

}

class EmpresaClientePK implements Serializable {

private static final long serialVersionUID = -6197593475314743037L;

@ManyToOne    
private Cliente cliente;   

@ManyToOne    
private Empresa empresa;

// getts e setts	

}

gahoffling , como eu setaria esse relacionamento no bean ou servlet para incluir com hibernate?

Sei que o post é muito antigo…mas fiquei curiosizimoooo kkkkkk:
Eu ja li varios livros de JPA e eu nunca vi um objeto chave primaria ter relacionamento mapeado com uma entidade :?: :?: :?:

[quote]@Embeddable
public class ProdutoLojaId implements java.io.Serializable {

// Fields

@ManyToOne(cascade = {CascadeType.MERGE}, fetch=FetchType.EAGER)
private Loja loja;

@ManyToOne(cascade = {CascadeType.MERGE}, fetch=FetchType.EAGER)
private Produto produto; [/quote]

Aonde é que existe base para se fazer algo do tipo? Tutorial, livros :?: :?: :?:
Alguem ai sabe?
Acho tal coisa não é portável JPA não…