[RESOLVIDO] Hibernate - Classe com herança e relacionamento

5 respostas
javahibernate
T

Olá galera,
tudo bem?

Por favor, poderiam me ajudar com o seguinte cenário. Tenho dúvida sobre como modelá-lo?

Tenho dois atores para o sistema:

  • Gerente
  • Representante

Onde 1 Gerente é responsável por muitos Representantes.

Como ambos possuem os mesmos atributos, criei uma classe abstrata chamada Usuario e herdo ela nas classes Gerente e Representante. Também criei um classe ENUM chamada Perfil.

O que preciso é, criar um gerente. Em outro momento, criar um representante e relacioná-lo com um gerente existente mas não estou conseguindo este resultado. Seguem minhas classes:

Enum PERFIL

public enum Perfil {
    REPRESENTANTE, GERENTE;
}

Classe USUARIO

package com.roche.planotatico.model;

import org.hibernate.annotations.Type;

import javax.persistence.*;
import javax.validation.constraints.NotNull;    
import java.util.Calendar;

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@TableGenerator(name = "USUARIO_GEN", table = "USUARIO_ID", pkColumnName = "ID", pkColumnValue = "USUARIO",
        valueColumnName = "VALOR", allocationSize = 1)
public abstract class Usuario {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "USUARIO_GEN")
    private Long id;

    @NotNull
    private String nome;

    @NotNull
    private String email;

    @Type(type = "true_false")
    private boolean status;

    @Temporal(TemporalType.DATE)
    private Calendar dataDeCatastro;

    @Temporal(TemporalType.DATE)
    private Calendar dataDoUltimoAcesso;

    @Enumerated(EnumType.STRING)
    private Perfil perfil;

    ... gets() e sets() ...
}

Classe REPRESENTANTE

package com.roche.planotatico.model;

import javax.persistence.*;

@Entity
@Table(name = "Representante")
public class Representante extends Usuario {

}

Classe GERENTE
Nela estou tentando criar o relacionamento 1 para N

package com.roche.planotatico.model;

import javax.persistence.*;
import java.util.List;

@Entity
@Table(name = "Gerente")
public class Gerente extends Usuario {

    @OneToMany
    private List<Representante> representantes;

    public List<Representante> getRepresentantes() {
        return representantes;
    }

    public void setRepresentantes(List<Representante> representantes) {
        this.representantes = representantes;
    }
}

O resultado que estou tendo atualmente é:

  • uma tabela para controlar numeração dos IDs
  • uma tabela para Representante;
  • uma tabela para Gerente;
  • uma tabela associativa gerente_representante - mas nela, o Id do gerente é uma chave primária, ou seja, não me deixa cadastrar um outro usuário para o mesmo gerente.

Por favor, poderiam me ajudar? Qual a boa prática de modelagem neste cenário?

Obrigado.

Abraço.

5 Respostas

F

pelo oque eu entedi isso daria certo, e nao precisaria criar o ENUM, Poderia mapear assim
realizer o mapeamento da sua superClasse que tem os atributos comuns

@MappedSuperclass
public class Usuario{}

depois herdar essa super classe nas suas classes filhas

@Entity

public class Gerente extends Usuario{

//e fazer o relacionamento do gerente com a lista de representantes

@OneToMany

@JoinColumn(name=“codigoColunaFk”)

private Representante representante;

}
T

Oi Fabioreis, blz? Valeu pelo help. Eu apenas inclui @JoinColumn(name=“codigoColunaFk”) na classe Gerente e ele adicionou a nova coluna respectiva na tabela Representante.

Legal. Agora, como faço para criar um Representante novo relacionado a um Gerente já criado?

Estou tentando buscar o Gerente criado no BD (manager.find(Gerente.Class, id)) - Depois, crio um Representante e passo ele como lista para o Gerente recuperado do banco. Em seguida, persisto o Representante (ele cria sem ID do gerente). Tem alguma idéia?

Valeu!

F

Faz tempo que usei JPA, mas pelo oque eu entendi voce precisa que o Representante tenha um ID do Gerente vc precisa fazer um relacionamento BIDIRECIONAL nas entidades, na entidade Representante tem que existir um relacionamento para GENRETE tbm.

tente colocar assim na entidade Representante
@ManyToOne
@joinColun(name=“ACOLUNADEFKDOGERENTE”)
private Gerente gerente

H

Procura sobre relacionamentos, OneToMany e ManyToOne na internet que existem vários exemplos de como implementar, como pelo visto você terá que criar um gerente primeiro e depois o representante, é só quando criar o representante, na coluna do gerente do hibernate, você passa o objeto do gerente selecionado, o hibernate já faz tudo, e você não precisa ficar se preocupando muito. ex: quero colocar o representante 2 no gerente 1, então vou buscar no banco o gerente 1 e colocar em uma variável do tipo gerente, depois é só eu pegar o representante 2 e fazer representante.setGerente(Gerente); e então dar um update no representante no banco, servico.update(Representante); Mas não se esqueça que tem que ter o mapeamento nas duas classe no hibernate, uma colocando o atributo @OneToMany e a outra o @ManyToOne.

T

Fabio e Heitor. Muito obrigado pela ajuda "). Funcionou do jeito que vocês sugeriram.

Valeu!

Criado 5 de abril de 2018
Ultima resposta 5 de abr. de 2018
Respostas 5
Participantes 3