5
respostas

Nomear constraint com relacionamento OneToMany

Estou tentando nomear as constraint, da forma como está o código a baixo, para deixar mais apresentável no banco de dados.

@OneToMany
    @JoinTable(name="cadpessoa_cadpessoa",
            joinColumns=
                {@JoinColumn(
                        foreignKey = @ForeignKey(name="fk_pessoa"),    
                        referencedColumnName="id",
                        name="cadpessoa_id"),
                @JoinColumn(
                        foreignKey = @ForeignKey(name="fk_resp_tec"), 
                        referencedColumnName="id", 
                        name="responsavel_tecnico_id")
                })


    private List<CadPessoa> responsavel_tecnico;

Ao executar para criar as tabelas no banco de dados retorna o seguinte erro: Caused by: org.hibernate.MappingException: Repeated column in mapping for collection: responsavel_tecnico column: responsavel_tecnico_id Gostaria de saber o motivo desse erro ou se tem alguma outra forma de nomear as constraints.

5 respostas

Como o erro diz você tá tentando referenciar id para dois campos. Não dá para fazer assim. Estou tentando imaginar a sua estrutura de tabelas mas creio que você precisa de duas colunas para poder referenciar a tabela responsavel_tecnico corretamente.

A tabela responsavel_tecnico é uma tabela filha da CadPessoa, onde um id da CadPessoa pode ter muitos id da mesma tabela CadPessoa. Nessa tabela CadPessoa tenho cadastros de pessoas jurídicas e físicas. Uma pessoa jurídica pode ter um ou muitos responsáveis técnicos que são pessoas físicas. Se eu deixar somente a anotação @OneToMany a tabela de relacionamento cadpessoa_cadpessoa é criada com as chaves estrangeiras da forma como eu declarei no código. Mas o nome dessas chaves fica com o código de criação do JPA.

Sem ideias, vou passar pra alguém te ajudar.

Você está tentando relacionar a tabela CadPessoa com ela mesma? Tipo, FK_PESSOA e FK_RESP_TEC se relacionam com a própria entidade CAD_PESSOA? Se for esse o caso você não pode ter "referencedColumnName="id" em ambas as FKs.

Manda o código completo dessa classe, por favor.

Otávio segue o código.

package br.com.labsementes.metadados.cadastro;

import java.util.List;

import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.ForeignKey; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.UniqueConstraint;

@Entity @Table(name="cadpessoa", uniqueConstraints = @UniqueConstraint(columnNames="cidade_id", name="uk_cidade")) public class CadPessoa {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

@Column(nullable=false, length=100)
private String razao_social;

@Column(nullable=false, length=100)
private String nome_fantasia;

@Enumerated(EnumType.STRING)
@Column(nullable=false, length=1)
private TipoPessoa tipo_pessoa;

@Enumerated(EnumType.STRING)
@Column(nullable=false, length=1)
private TipoFisicaJuridica tipo_fis_jur;

@Column(nullable=true)
private Integer inscricao_estadual;

@Column(nullable=true)
private Integer inscricao_municipal;

@Column(nullable=true, length=14)
private String cpf;

@Column(nullable=true, length=18)
private String cnpj;

@Column(nullable=true, length=255)
private String endereco;

@Column(nullable=true, length=255)
private String complemento;

@Column(nullable=true, length=100)
private String bairro;

@Column(nullable=true, length=9)
private String cep;

@Column(nullable=true, length=25)
private String telefone;

@Column(nullable=true, length=100)
private String email;

@Column(nullable=true, length=20)
private String renasem;

@Column(nullable=true, length=20)
private String crea;

@JoinColumn(foreignKey = @ForeignKey(name="fk_cidade"))
@OneToOne
private CadCidade cidade;


@OneToMany
@JoinTable(name="cadpessoa_cadpessoa",
        joinColumns=
            {@JoinColumn(
                    foreignKey = @ForeignKey(name="fk_pessoa"),    
                    referencedColumnName="id",
                    name="cadpessoa_id"),
            @JoinColumn(
                    foreignKey = @ForeignKey(name="fk_resp_tec"), 
                    referencedColumnName="id", 
                    name="responsavel_tecnico_id")                
            })                        
private List<CadPessoa> responsavel_tecnico;

public Integer getId() {
    return id;
}
public void setId(Integer id) {
    this.id = id;
}
public String getRazaoSocial() {
    return razao_social;
}
public void setRazaoSocial(String razao_social) {
    this.razao_social = razao_social;
}
public String getNomeFantasia() {
    return nome_fantasia;
}
public void setNomeFantasia(String nome_fantasia) {
    this.nome_fantasia = nome_fantasia;
}    
public TipoPessoa getTipoPessoa() {
    return tipo_pessoa;
}
public void setTipoPessoa(TipoPessoa tipo_pessoa) {
    this.tipo_pessoa = tipo_pessoa;
}
public TipoFisicaJuridica getTipoFisJur() {
    return tipo_fis_jur;
}
public void setTipoFisJur(TipoFisicaJuridica tipo_fis_jur) {
    this.tipo_fis_jur = tipo_fis_jur;
}
public Integer getInscricao_estadual() {
    return inscricao_estadual;
}
public void setInscricao_estadual(Integer inscricao_estadual) {
    this.inscricao_estadual = inscricao_estadual;
}
public Integer getInscricao_municipal() {
    return inscricao_municipal;
}
public void setInscricao_municipal(Integer inscricao_municipal) {
    this.inscricao_municipal = inscricao_municipal;
}
public String getCpf() {
    return cpf;
}
public void setCpf(String cpf) {
    this.cpf = cpf;
}
public String getCnpj() {
    return cnpj;
}
public void setCnpj(String cnpj) {
    this.cnpj = cnpj;
}
public String getEndereco() {
    return endereco;
}
public void setEndereco(String endereco) {
    this.endereco = endereco;
}
public String getComplemento() {
    return complemento;
}
public void setComplemento(String complemento) {
    this.complemento = complemento;
}
public String getBairro() {
    return bairro;
}
public void setBairro(String bairro) {
    this.bairro = bairro;
}
public String getCep() {
    return cep;
}
public void setCep(String cep) {
    this.cep = cep;
}
public String getTelefone() {
    return telefone;
}
public void setTelefone(String telefone) {
    this.telefone = telefone;
}
public String getEmail() {
    return email;
}
public void setEmail(String email) {
    this.email = email;
}
public String getRenasem() {
    return renasem;
}
public void setRenasem(String renasem) {
    this.renasem = renasem;
}
public String getCrea() {
    return crea;
}
public void setCrea(String crea) {
    this.crea = crea;
}

}

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software