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.