1
resposta

hibernate adicionar tipo numa join column

Boa noite, galera!

Estou com um problema em criar tabelas num banco mysql utilizando hibernate.hbm2ddl.auto

minhas entidades:

@Entity
@Table(name="cliente")
public class Cliente implements Serializable {

    private static final long serialVersionUID = 6193898636018045289L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="codigo_cli")
    private Long codigoCli;

    @Column(name="email_cli", nullable = true)
    private String email;

    @Column(name="nome_cli", nullable = true)
    private String nome;

    @Column(name="cep_cli" , nullable = false)
    private String cep;

    @Column(name="cel_cli", nullable = true)
    private String celular;

    @Column(name="senha_cli", nullable = true)
    private String senha;

    @JoinColumn(name = "cod_bairro_cli",referencedColumnName="id")
    @Column(name="cod_bairro_cli")
    private Bairro bairro;

    @Column(name = "numero", nullable = false)
    private Integer numero;

    public Cliente() {
        super();
    }

    public Long getCodigoCli() {
        return codigoCli;
    }

    public void setCodigoCli(Long codigoCli) {
        this.codigoCli = codigoCli;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCep() {
        return cep;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    public String getCelular() {
        return celular;
    }

    public void setCelular(String celular) {
        this.celular = celular;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public Bairro getBairro() {
        return bairro;
    }

    public void setBairro(Bairro bairro) {
        this.bairro = bairro;
    }

    public Integer getNumero() {
        return numero;
    }

    public void setNumero(Integer numero) {
        this.numero = numero;
    }    





@Entity
@Table(name = "bairro")
public class Bairro implements Serializable{

    private static final long serialVersionUID = 6437676189864185368L;

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

    @JoinColumn(name = "cod_municipio")
    @Column(name = "cod_municipio")
    private Municipio codMunicipio;

    @Column(name = "descricao", nullable = false)
    private String descricao;

    @Column(name = "cod_bairro", nullable = true)
    private Integer codBairro;


    public Bairro() {
        super();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Municipio getCodMunicipio() {
        return codMunicipio;
    }

    public void setCodMunicipio(Municipio codMunicipio) {
        this.codMunicipio = codMunicipio;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Integer getCodBairro() {
        return codBairro;
    }

    public void setCodBairro(Integer codBairro) {
        this.codBairro = codBairro;
    }

Porém ao gerar as tabelas o cod_bairro_cli que é foreign key aparece com o tipo tinyBlob, porém a pk id do bairro, aparece como integer, como consigo configurar o cod_bairro_cli para integer?

Hibernate:

create table bairro (
   id integer not null auto_increment,
    cod_bairro integer,
    cod_municipio tinyblob,
    descricao varchar(255) not null,
    primary key (id)
) engine=InnoDB

Hibernate:

create table cliente (
   codigo_cli bigint not null auto_increment,
    cod_bairro_cli tinyblob,
    cel_cli varchar(255),
    cep_cli varchar(255) not null,
    email_cli varchar(255),
    nome_cli varchar(255),
    numero integer not null,
    senha_cli varchar(255),
    primary key (codigo_cli)
) engine=InnoDB]

Grato,

Fernando

1 resposta

Olá Fernando, seria bem simples a solução, ao invés de usar JoinColumn você utiliza os relacionamentos.

Por exemplo @OneToMany @OneToOne @ManyToOne @ManyToMany

Por exemplo no seu caso você teria um bairro para vários clientes. Então na classe cliente na coluna bairro vc faria assim.

public  class Cliente {
    @ManyToOne
    private Bairro bairro;
}

e na classe Bairro

public class Bairro {
    @OneToMany (mappedBy = "bairro")
    private List<Cliente> clientes;
}

Agora em vista de melhorar o seu projeto, creio que a engenharia da sua classe não está muito boa.

Veja o seguinte problema, você está relacionando um Cliente a um Bairro que contém dentro de um Município. Veja que isso obriga você ter um cadastro de Bairro e obriga você relacionar o Município dentro do Bairro.

Não imagino que ganhos você teria com essa abordagem, acredito que isso daria um custo na sua usabilidade com o cliente, e não teria um retorno em ganho esperado significativo de informação.

Uma abordagem mais interessante seria apenas você relacionar o Município diretamente ao Cliente e o Bairro ser tratado apenas como uma String em sua classe. Essa string pode ser tratada, para dados incorretos. (Acredito essa abordagem ser melhor em termos de usabilidade, manutenção de código e resultado).

Outra abordagem interessante era você relacionar o Município ao Cliente, criar um objeto de Bairro mas que não tenha relação com o Município, assim o bairro apenas ficaria relacionado ao cliente, dessa forma você poderia manter um cadastro de bairro se necessário. No entanto ao meu ver isso somente seria custoso em uma class meramente burra, e que vai ocupar o espaço em uma tabela no seu banco de dados.

Espero ter ajudado. Att. Rafael.