Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Relacionamento entre coleções de Mapas (java.util.Map)

Eu consegui compreender o conceito dos relacionamentos em listas e tudo mais, mas surgiu uma dúvida que tentarei explicar em um exemplo prático:

Uma organização, possui departamentos e esses departamentos são gerenciados por um funcionário. Entretanto, existem várias organizações que utilizam esse departamento e cada uma delas possuem funcionários distintos como responsáveis.

Segue o código de exemplo:

Departamento.java

@Entity
public class Departamento {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @NotNull
    private String nome;
    //...
}

Funcionario.java

@Entity
public class Funcionario {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @NotNull
    private String nome;
    @NotNull
    private String cargo; 
    //...
}

Organizacao.java

@Entity
public class Organizacao {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @NotNull
    private String nome; 

    // cada departamento possui um funcionário responsável 
    private Map<Departamento, Funcionario> departamentos; 
    //...
}

Como deve ser feito o mapeamento para que a tabela de relacionamento no banco de dados (organizacao_departamentos, por exemplo) fiquem com a seguinte estrutura?

mysql> desc organizacao_departamento;
+-----------------+---------+------+-----+---------+-------+
| Field           | Type    | Null | Key | Default | Extra |
+-----------------+---------+------+-----+---------+-------+
| id_organizacao  | int(11) | NO   | PRI | NULL    |       |
| id_departamento | int(11) | NO   | PRI | NULL    |       |
| id_funcionario  | int(11) | NO   | MUL | NULL    |       |
+-----------------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)

Sendo:

  • id_organização e id_departamento chaves compostas e relacionadas com suas tabelas: organização e departamento, respectivamente;
  • id_funcionario o funcionário responsável pelo departamento dentro da respectiva organização, conforme descrito pela chave composta.
2 respostas
solução!

O melhor você é criar uma outra classe que teria um atributo organizao, funcionario e departamento. E a organização teria uma lista desse objeto :). Fica muito mais simples de gerenciar e já preparado para qualquer evolução no modelo.

Então Seria:

@Entity
public class Organizacao {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @NotNull
    private String nome; 

    // cada departamento possui um funcionário responsável 
    // java.util.Set para não ter elementos repetidos na lista
    private Set<DepartamentoOrganizacao> departamentos; 
    //...
}

e a classe DepartamentoOrganizacao.java

public class DepartamentoOrganizacao {
    private Departamento depto;
    private Funcionario func; 

    public DepartamentoOrganizacao(Departamento depto, Funcionario func) {
        this.depto = depto;
        this.func = func;
    }
}

Isso? Não sei se entendi bem...