Relacionamento manyToOne opcional (tabela de junção) bidirecional

1 resposta
S
Pessoal, tenho um relacionamento entre as entidades Equipamento e Cliente onde cliente é opcional. Para não deixar valor de chave nulo na tabela equipamento, criei uma tabela de junção equipamento_cliente na classe Equipamento.
public class Equipamento {    
    
    private Integer equipamentoId;
    private Cliente cliente;
    
    // mapeamento com tabela de junção
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinTable(name = "equipamento_cliente", joinColumns = {@JoinColumn(name = "equipamento_id")},
            inverseJoinColumns = {@JoinColumn(name = "cliente_id")})
    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }
}
Até aí tudo certo, mas o problema é quando mapeio bidirecionalmente na classe Cliente, aparece o seguinte erro na compilação: Deployment "persistence.unit:unitName=#Projeto" is in error due to the following reason(s): org.hibernate.MappingException: Unable to read the mapped by attribute for equipmentos in org.domain.projeto.entity.Cliente! O mapeamento bidirecional fiz da seguinte forma:
public class Cliente {

	private Integer clienteId;	
	private List<Equipamento> equipamentos;
	
	// mapeamento bidirecional
	@OneToMany(mappedBy = "cliente")
	public List<Equipamento> getEquipamentos() {
		return equipamentos;
	}

	public void setEquipamento(List<Equipamento> equipamentos) {
		this.equipamentos = equipamentos;
	}
}
Alguém sabe o que está errado ou o que falta? Todos os outros mapeamentos bidirecionais @ManyToOne/@OneToMany funcionam, mas todos são @JoinColumn. Valeu pessoal!!!

1 Resposta

D

Olá, Samerjamal!

Eu não entendi bem o porquê de você utilizar essa outra @JoinTable.
Acho que essa anotation deveria ser utilizada para relacionamentos ManyToMany (segundo a especificação), e não OneToMany/ManyToOne.

Acho que funcionaria assim:

public class Equipamento {      
      
     private Integer equipamentoId;  

     @ManyToOne(fetch = FetchType.LAZY)  
     @JoinColumn(name = "cliente_id") 
     private Cliente cliente;  
        
     public Cliente getCliente() {  
         return cliente;  
     }  
   
     public void setCliente(Cliente cliente) {  
         this.cliente = cliente;  
    }  
}
public class Cliente {  
   
     private Integer clienteId; 

     @OneToMany(mappedBy = "cliente")
     private List<Equipamento> equipamentos;  
       
     public List<Equipamento> getEquipamentos() {  
         return equipamentos;  
     }  
   
     public void setEquipamento(List<Equipamento> equipamentos) {  
         this.equipamentos = equipamentos;  
     }  
}
Criado 20 de outubro de 2010
Ultima resposta 20 de out. de 2010
Respostas 1
Participantes 2