Entidades e Relacionamentos
Objetivos
- Entender como utilizar conceitos de entidades e relacionamentos para modelar sistemas
- Esses modelos serão utilizados principalmente na fase de análise
- Mas mostramos também a implementação em Java
- Entender como representar modelos de Entidade-Relacionamento (ER) usando UML
Introdução
- Uma parte importante do desenvolvimento do software é entender e explorar os requisitos para o sistema. É necessário que se entenda como o sistema funciona. A modelagem vem para auxiliar, principalmente durante a fase de análise, no planejamento do sistema
- A Modelagem com Entidade-Relacionamento é uma metodologia antiga mas ainda muito utilizada na prática, principalmente no mundo de Banco de Dados para análise e projeto de sistemas de informação
- A Modelagem ER não utiliza conceitos O-O. O que será feito no curso é apresentar conceitos ER utilizando uma linguagem de modelagem gráfica O-O (UML)
Elementos de Modelagem usando ER
- A Modelagem em ER se baseia em artefatos
- Artefatos podem ser:
- Físicos (Ex.: Produtos, Empregados)
- Representar uma transação (relacionamento) entre artefatos (Ex.: Pedido, Entrega)
- Cada artefato irá conter informações sobre si (de forma semelhante a atributos de objetos)
- Os quatro elementos essenciais da modelagem ER são:
- Tipos de Entidades
- Atributos
- Tipos de Relacionamentos
- Atributos de Relacionamentos
Tipos de Entidades
Atributos

- Vemos os Atributos nome e idade destacados na segunda "linha" do diagrama de classe
- Os métodos estão na terceira "linha" do Diagrama de classe
Tipos de Relacionamentos
- Descrevem associações entre tipos de entidades
- As instâncias de um tipo de relacionamento são relacionamentos entre entidades
- O tipo de relacionamento diz que o relacionamento entre os tipos podem ou não ocorrer
- Para um determinado par de entidades, o relacionamento pode ou não existir
- Exemplo:
- O Empregado produz Produto (Tipo de Relacionamento)
- O Empregado João produz Produto Rapadura (Relacionamento)
- Já o Empregado José pode não produzir nada
- Os tipos de relacionamentos são caracterizados por:
- Grau: Trata-se da quantidade de tipos de entidade relacionados através do relacionamento. Um relacionamento "casamento" envolvendo os tipos de entidade Homem e Mulher é de grau 2 (binário). Um relacionamento "é filho de" envolvendo os tipos de entidade Homem, Mulher e Filho possui grau 3 (ternário), e assim por diante.
- Cardinalidade: Trata-se da relação de quantas entidades podem estar envolvidas de cada lado do relacionamento. São cardinalidades mais comuns:
-
1 para 1: Uma entidade de tipo A está associada no máximo a uma entidade de tipo B, e uma entidade de tipo B está associada no máximo a uma entidade de tipo A.
- Exemplo: Um Homem se casa com no máximo uma Mulher, e uma Mulher se casa com no máximo um Homem.
- 1 para N: Uma entidade de tipo A está associada a qualquer quantidade da entidade de tipo B, mas uma entidade de tipo B está associada a no máximo uma entidade de tipo A.
- Exemplo: Uma empresa pode ter vários funcionários, mas um funcionário somente trabalhará em uma empresa
-
N para 1: Uma entidade de tipo A está associada a no máximo a uma entidade do tipo B, enquanto uma entidade do tipo B está associada a qualquer quantidade de entidades do tipo A
.
- Exemplo: um empregado pode ter somente um chefe, mas um chefe pode ter vários empregados
- N para M: Entidades do tipo A e B estão relacionadas em qualquer quantidade, de uma para outra
- Exemplo: Um time de futebol tem vários torcedores, e cada torcedor pode torcer para vários times de futebol
Posteriormente veremos implementação em Java dos relacionamentos citados.
- Em UML os relacionamentos de classes são representados através de Associação, Herança ou Generalização, Agregação e Composição. Veja aqui exemplos desses relacionamentos.
Atributos de tipos de Relacionamento
- Um relacionamento pode ter atributos associados, o que indica que o atributo não pertence a nenhuma entidade sozinha, mas ao relacionamento entre entidades
- Exemplo: As entidades Homem e Mulher participam do relacionamento "casar". O atributo "data-do-casamento" não pertence a nenhuma entidade isolada, e sim ao relacionamento entre essas duas entidades
Implementando Relacionamentos
- Relacionamentos em Java são implementados através da combinação de atributos e métodos. Os atributos descrevem o relacionamento e os métodos definem e atualizam o relacionamento. Serão apresentados os seguintes relacionamentos:
- Relacionametos Unidirecionais
- Relacionamentos 1 para 1
- Relacionamentos 1 para N
- Relacionamentos N para M
- Agregação e Composição
Relacionamentos Unidirecionais
- Relacionamentos unidirecionais são aqueles que só podem ocorrer em uma direção. Um exemplo em UML desse relacionamento:

- No exemplo acima uma pessoa mora somente em um endereço. Esse relacionamento unidirecional é representado pela seta apontada na direção da classe Endereço
- A classe Pessoa, em seu código, configura o endereço através de metodos get e set . Esse código é suficiente para gerenciar o relacionamento entre os dois objetos, mantendo o fato de que uma pessoa vive somente em um endereço
Relacionamentos 1 para 1
- São relacionamentos construídos através da manuntenção um atributo de instância em cada uma ou em ambas as classes.
- Aproveitando a idéia de Pessoa e Endereço, devemos complementar a classe Endereco para que tenha informações a respeito da classe Pessoa. Assim, teremos o diagrama UML para esse relacionamento:

Relacionamentos 1 para N
- Os relacionamentos 1 para N (ou N para 1) não podem ser implementados simplesmente pela combinação de um atributo e métodos get e set em uma das classes
- É necessário utilizar uma coleção de objetos para gerenciar a parte de N elementos do relacionamento.
- Vamos considerar um relacionamento entre Cursos e Aulas. Um curso é composto de várias aulas, mas uma aula pertence somente a determinado curso.
- Uma classe Curso deve manter uma coleção de aulas, enquanto a classe Aula deve manter uma referência a um curso
- Temos então:
- Classe Curso:
public class Curso {
private HashSet aulas;
// Outros Atributos
// .......
public Curso {/*
Inicializar atributos....
*/}
public HashSet getAulas() {
return aulas;
}
public void addAula(Aula aula) {
// Se a aula ainda não está na coleção, adicioná-la.
if (! getAulas().contains(aula)) {
getAulas().add(aula);
// Indica para a aula que agora ela pertencerá a esse curso
aulas.addCurso(this);
}
}
public void removeAula(Aula aula) {
// Verifica se a aula está na coleção
if (getAulas().contains(aula)) {
getAulas().remove(aula);
// Atualiza a aula, indicando que não pertence mais a aquele curso
aula.removeCurso(this);
}
}
Classe Aula:
public class Aula {
private Curso curso;
// Incluir outros atributos
// ...............
public Aula() {/*
Inicializar Atributos
*/}
public void addCurso(Curso curso) {
// Verificar se curso já não está inicializado
this.curso = curso;
}
public void addCurso(Curso curso) {
// Verificar se curso foi inicializado
curso = null;
}
}
Podemos observar que a classe Curso terá uma coleção de objetos aula, o que equivale, em nosso relacionamento, a dizer que um Curso tem várias Aulas
Já a classe Aula contém somente um objeto Curso, pois uma aula pertence a somente um curso
Relacionamento N para M
- Trata-se do relacionamento que requer maior quantidade de trabalho, já que cada uma das partes deve manter uma coleção de objetos da outra parte.
- Utilizando o exemplo do relacionamento anterior, e supondo que uma aula pertença agora a vários cursos (e não mais somente a um), o diagrama UML para o relacionamento N para M (ou muitos para muitos) será o seguinte:

Agregação e Composição
- São implementados da mesma forma como relacionamentos
- A principal diferença é que agregação implica em um relacionamento mais fraco na construção do relacionamento, se comparado com composição
- Composição é uma forma de relacionamento em que um todo é completamente responsável por suas partes e cada parte somente está associada a um todo.
intro programa