Olá sejam bem-vindos ao canal engenharia de software com ênfase Eu sou professor GES gues e eu já trabalho na área de mod de software há vários anos eu já publiquei vários livros sobre o assunto e já ministrei diversas palestras e cursos técnicos so modelagem de software com a linguagem uml na aula de hoje eu pretendo falar de como mapear classes em tabelas relacionadas na verdade esse tema vai ser dividido em dois vídeos uma vez um pouco extenso um pouquinho complexo Então vamos dar início à nossa aula Ok então eu gosto sempre de fazer uma pequena
propaganda eu como falei eu já publiquei quatro livros sobre o ML o meu primeiro livro foi o ML uma abordagem prática que na época tratava da uml 1.5 mas já incluí a uml2 no final do livro depois eu lancei um livro exclusivo sobre O2 que foi o guia de um guia de consulta rápida ah Poucos Anos depois eu transformei esse guia num no livro m2 guia prática e depois eu lancei o meu livro mais importante que é o m2 uma abordagem prática que se encontra na terceira Edição bom nós vamos ao assunto nós vamos falar
sobre persistência ã pode ser necessário preservar os objetos de uma classe eles precisam ser gravados em disco uma classe cujos objetos precisam ser gravados em disco é chamada persistente enquanto Que classes cujas instâncias não precisam ser gravadas em disco são chamadas de classes transientes ah classe de entidade em geral São persistentes enquanto que classe de fronteira e de controle em geral São transientes classe de entidad já foram ensinado em outros vídeos classe entidade são classes que se referem diretamente ao domínio do problema muitas vezes terão muitos objetos e muitas vezes elas serão persistentes classe de
Fronteira são classes cujas instâncias interagem com os usuários servem de intermediário entre os usuários e o sistema e as classes de controle são classes cuos objetos interpretam os eventos ocorridos sobre as classes sobre as instâncias de fronteira e se a se acharem necessário repassam para as classes de entidade normalmente solicitando a execução de métodos bom mas embora quase sempre uma classe de entidade seja persistente isso não é uma regra então é necessário às vezes identificar quais classes serão persistentes e também pode ser necessário definir quais atributos da classe precisarão ser gravados porque podem haver atributos
transientes que são atributos que não precisam ser gravados em disco puro serem calculados por exemplo Ah bom como eu falei muitas vezes uma classe persistente vai ter o seu equivalente em uma tabela relacional eh nessas situações ã cada atributo da classe se torna uma coluna na tabela e cada objeto na classe vai se tornar uma linha Além disso muitas vezes é necessário criar uma chave primária para a tabela criada muitas vezes não sempre Ah vamos fazer uma pequena revisão nós estamos trabalhando aqui com o mapeamento de classe em tabelas relacionais tabelas relacionais são um tipo
de estrutura suportada por bancos de dados eh um banco de dados nada mais é que o repositório lógico de informação eh uma tabela é uma divisão lógica desse repositório colunas são divisões lógicas de uma tabela em geral corresponde a Campos e linhas são registros nessas tabelas uma chave primária é um uma coluna ou conjunto de colunas que identificam de forma única uma determinada linha na tabela bom ã como eu falei muitas vezes uma classe de assistente uma classe de entidade vai ter se equivalente em uma tabela relacional ah obviamente quando nós estivermos fazendo mapeamento para
bos de dados relacionais ã Mas isso não é uma regra uma classe pode eventualmente ser mapeada em mais uma tabela ou uma tabela pode representar muitas classes nós vamos ver isso ao longo desse vídeo e do seguinte Ah isso é particularmente comum quando se trabalha com hierarquias de classes que foram definidas por meio de herança então eh não necessariamente cada classe vai corresponder a uma tabela nós vamos ver isso no segundo vídeo sobre o assunto bom então vamos falar sobre mapeamento de classes em tabelas relacionadas Ah bom a maneira como as instâncias de uma classe
vão ser preservadas vai depender da forma como o sistema for ser implementado na verdade eu posso eh simplesmente preservar os objetos das classes por meio de arquivos textos se eu desejar fazer isso não é a forma mais inteligente nem mais prática Mas é possível Ah mas em geral os objetos de classes eles são persistidos por meio de um sgbd sgbd significa sistema gerenciador de banco de dados O que é diferente de um banco de dados um banco de dados como eu falei anteriormente é um repositório lógico de informação enquanto que o sistema gerenciador de banco
de dados é um software que tem por por que tem por função gerenciar bancos de dados ele pode gerenciar diversos bancos de dados quentes Ah então continuando existem eh atualmente vários frameworks de persistência que se responsabilizam por eh pela persistência dos objetos das classes Como por exemplo o hibernate o entity Framework o JPA o torque o Castor entre outros porém em nível de projeto é preciso saber em quais tabelas os objetos das minhas classes estão sendo persistidos então por isso que nós precisamos fazer esse mapeamento bom ah eu vou falar sobre o estereótipo table Como
já foi ensinado em outros vídeos no estereótipo ele atribui novas características a um elemento que já existia e ele passa a ter um comportamento diferente dos seus iguais Então existe um perfil de persistência da umr onde foi criado o estereótipo table esse estereótipo é aplicado a classes e a partir desse momento a partir do momento que uma classe recebe o estereótipo table ela passa a se comportar como uma tabela eu vou apresentar exemplos disso Ahã bom Como já foi falado nos casos mais simples uma classe persistente é mapeada é uma tabela então só é preciso
definir uma chave primária para a tabela que for mapeada para isso pode-se utilizar uma das colunas mapeadas para isso Ou então pode-se criar uma coluna nova para essa função Ah aqui nós temos o exemplo de aplicação do sterico table do mapamental uma classe que recebeu o estereótipo table Então eu tenho aqui a classe conta comum que tem diversos atributos e eu tenho aqui uma tabela que recebeu o mesmo nome essa tabela é uma classe que recebeu exterior óp table Então esse é um estereótipo gráfico que modifica o desenho padrão da classe bom ah numa classe
que recebeu estere table a divisão dos atributos passa a ser a divisão Para representar as colunas e a divisão das operações passa a ser uma divisão para identificar Chaves primárias Chaves estrangeiras e outras informações como nós vamos estudar daqui a pouco então aqui nós mapeamos os atributos da classe conta comum em colunas na tabela conta comum como a coluna ponta ela já servia para ah servir de chave primária nós não achamos necessários necessário criar uma coluna para isso então ela passou a ser a chaveada da tabela como demonstra esse eh essa sigla PK à esquerda
do nome da coluna PK é abreviatura de Primar aqui ou chave primário aqui nós utilizamos o formato do post G por isso que o tipo long foi mapeado no tipo bigint no tipo tipo date foi mapeado no tipo time stamp e o tipo Double foi mapeado no tipo numéri continuando bom a gente viu como como mapear classes em tabelas relacionais agora Como nós tratamos o mapeamento de associações bom vamos ver isso ã existem ass existem diversos tipos de associações como como nós Já estudamos anteriormente ah existe associações um para um associações um para muitos e
ões muitos para muitos bom ah no caso de associações um para um elas ocorrem quando um objeto em uma das extremidades da associação está relacionado a somente um objeto na outra extremidade e vice-versa bom vamos ver um exemplo disso aqui nós temos uma classe chamada pessoa que tem um atributo nome pessoa do tipo string ela possui uma associação unária ou ou reflexiva ou seja uma associação ã dela com ela mesma quer dizer um objeto da classe pessoa pode estar relacionado com objetos de outra classe pessoa desculpa com objetos da mesma classe pessoa então aqui eu
estou dizendo que uma pessoa é cônjuge de outra pessoa Ahã vocês podem notar que existem aqui os papéis de objeto marido e esposa e a multiplicidade aqui indica que um objeto está relacionado a somente um objeto da classe as pessoas ah esse papel de objeto esse texto marido identifica o papel que o objeto nessa extremidade desempenho e a esposa o papel que o objeto na outra extremidade desempenha aqui foi acentado uma restrição dizendo que o objeto marido tem que ser diferente do objeto esposa então basicamente uma pessoa é cônjuge de outra pessoa certo como nós
mapeamos isso bom aab a classe pessoa foi mapeada numa tabela de mesmo o nome e o atributo nome pessoa for apiado na coluna nome pessoa ã bom ã nome pessoa não serve como chave primária Então se criou uma coluna para isso que foi chamada código de pessoa ah acontece que como uma pessoa pode estar relacionada com outra pessoa eu precisei definir uma chave estrangeira que eu chamei de cônjuge de pessoa uma chave estrangeira é um campo ou conjunto de Campos que serve para identificar ah outra linha que não a que está sendo trabalhada consultada nesse
momento outra linha significa Outro registro no caso outra pessoa então você notar que na divisão de baixo apareceu além da informação PK que era a chave primária apareceu também informação f o estereótipo FK dizendo que eu tenho uma chave estrangeira chamada cnjuge que ela serve quea dop Além disso também tem uma informação de que existe um atributo único ou seja um atributo que não pode se repetir em outra linha da tabela por quê Porque uma pessoa não pode ser casada com mais de uma pessoa meso tempo bom então por isso o cônjuge de pessoa está
sublinhado bom agora a associação unária da classe pessoa foi mapeada numa Associação unária na tabela pessoa onde eu digo que para descobrir de quem uma pessoa é cônjuge eu tenho que pegar o valor do da coluna cônjuge e compar com o valor da do do campo código pessoa nas outras linhas dessa tabela no momento que eu encontrar ã um código de pessoa igual ao código do cônjuge eu descobri de quem a pessoa é cônjuge certo então esse aqui é o mapeamento um exemplo de mapeamento de associações um para um com relação a associações um para
muitos quando existe uma associação um para muitos no momento que for feito o mapeamento para tabelas relacionais ã eu preciso criar uma chave primária na tabela da extremidade muitos vamos ver aqui no exemplo aqui eu tenho um trecho do modelo conceitual do Sistema de Controle bancário onde eu afirmo que uma conta comum registra no mínimo no máximo muitos movimentos e no movimento pode registrado por somente uma conta comum então aqui uma associação um para muitos entre duas classes então eu mapeei a classe conta comum na tabela conta comum e mapei a classe movimento na tabela
movimento a classe A tabela conta comum já foi explicada a tabela movimento todos os atributos da classe movimento foram mapeados em colunas dessa tabela ã mas eu precisei criar também uma chave primária código código movimento porque nenhuma das colunas ã era útil para essa função e eu precisei criar uma chave estrangeira que eu chamei de número Conta Movimento para descobrir a que conta esse movimento pertence a que conta cada movimento pertence então aqui a associação um para muitos entre a tabela conta comum e a tabela movimento eu tenho uma instrução aqui entre parênteses que o
número da conta movimento tem que ser igual ao número da conta quer dizer que para eu descobrir a qual conta o movimento pertence eu tenho que pegar o número da conta daquele movimento e comparar com a coluna número de número conta de da da tabela conta comum no momento que elas forem iguais eu descobri a qual conta aquele movimento pertence com relação à associações muitos para muitos Ah uma associação muitos para mos ela é perfeitamente válida na orientação objetos desde que eh a condição que não haja nenhum atributo particular relativo a um objeto específico associado
a outro objeto específico seja satisfeita mas no modelo relacional uma associação muitos para muitos não é válido eu preciso criar uma tabela intermediária entre essa Associação vamos ver um exemplo disso eh bom assim além disso eu preciso criar Chaves estrangeiras na tabela intermediária para Que ela possa se relacionar com as tabelas que ela está intermediando da sucção eh então Aqui nós temos um exemplo eh nós temos aqui um outro techo um outro trecho do Sistema de Controle bancário do modelo conceitual de Sistema de Controle bancário onde uma classe pessoa se relaciona com uma classe conta
comum eu estou dizendo que uma pessoa possui no mínimo uma no máximo muitas contas comum e uma conta comum é possuída por no mínimo uma no máximo muitas pessoas bom ah eu eu mapeei a classe conta comum na tabela conta comum e a classe pessoa na tabela pessoa a classe A tabela ponto comum já havia sido explicada e a tabela pessoa H todos os atributos da classe pessoa foram mapeadas eh em colunas e foi criado uma coluna extra para servir de chave primário bom mas acontece como não pode acontecer de haver uma situação muitos para
muitos entre pessoa e conta foi necessário criar a tabela pessoa conta que ela está servindo como tabela intermediária ela relaciona ela se relaciona com pessoa e se relaciona com conta comum e ela tem dois Campos número conta pessoa e códo pessoa conta que el que eles servem como Chaves estrangeiras para relacionar a a tabela pessoa conta com a tabela conta comum e a tabela pessoa conta com a tabela pessoa Ah o conjunto desses dois Campos serve também de chave primária para essa tabela bom mas então você vão anotar para que os para que tu descubra
a a quem uma linha da tabela pessoa fonte está relacionada com relação à tabela pessoa eu tenho que comparar o o o campo código pessoa conta com o campo código pessoa da tabela pessoa e para descobrir a quem uma linha da tabela pessoa conta está relacionada se relaciona com H uma linha da tabela conta comum eu tenho que comparar o o campo código a desculpa tem número conta pessoa com o campo número conta da tabela conta então se eu quiser saber todas as contas que uma pessoa possui eu tenho que pegar o código da pessoa
da tabela pessoa que eu estou quando consultar eh e comparar com a as linhas da tabela pessoa conta então para cada linha da tabela pessoa conta que cujo nome ah cujo valor seja igual ao código de pessoa eu vou pegar o número conta pessoa daquela linha e comparar com as linhas da tabela conta comum até encontrar uma conta cujo número da conta seja igual ao valor contido em número conta à pessoa então eu vou retornar aquela conta porque ela pertence à pessoa e vou fazer isso até não encontrar mais contas comuns cujo número da conta
seja igual ao campo número da conta out pessoa então esta foi a nossa primeira aula sobre o mapeamento de tabelas relacionais mamento de classes em tabelas relacionais eu espero que vocês tenham achado essa aula útil e agradeço a atenção de vocês peço que se vocês gostaram eh curtam e compartilh esse vídeo e nós nos vemos na próxima aula