Diagrama

Diagrama

O objetivo do Diagrama de dados é descrever a estrutura das classes, com seus atributos e relacionamentos (Figura 1). A criação e edição das classes do diagrama podem ser feitas a partir de recursos visuais, como drag-and-drop, permitindo em seguida, o uso de ferramentas para gerar de forma automática as camada de persistência e páginas CRUDs.

Figura 1 - Layout do diagrama

Acesso ao Editor

No Cronapp, os diagramas de dados ficam no diretório Diagramas de Dados (Localização: Diagramas de dados/) e, por padrão, todos os projetos possuem o diagrama  “app”, porém, outros podem ser criados no mesmo diretório. Ao expandir o arquivo do diagrama na árvore de arquivo (destaque 1 da figura 1.1), tanto as classes quanto os atributos dessas classes serão exibidos. Ao clicar duas vezes sobre uma classe ou atributo, a janela de configuração da classe ou atributo é exibida dentro do Editor do Diagrama (figuras 4.1 e 4.2).

O menu de contexto "Ação" (destaque 2 da figura 1.1) das classes e seus atributos permitem gerar páginas CRUDs com o Assistente de CRUD ou gerar um relatório (veja mais detalhes no tópico "Criar relatórios" da documentação Relatório).

Figura 1.1 - Hierarquia de um arquivo de diagrama de dados

Classes

As classes que são geradas junto aos projetos Cronapp contemplam as funcionalidades de permissão de segurança, log de auditoria, sistemas de multi aplicações e registros dos dispositivos móveis. Para mais detalhes, acesse os links da coluna funcionalidades da tabela abaixo.

 

Nome da Entidade

Descrição

Funcionalidades

Nome da Entidade

Descrição

Funcionalidades

User

Usuários.

Role

Grupos (função).

Login

Logins de provedores externos para um usuário.

Securable

Permissionáveis.

View

Páginas com restrições de acesso.

RoleSecurable

Associa grupos e permissionáveis.

UserSecurable

Associa usuários e permissionáveis.

UserRole

Associa usuários e grupos (função).

Application

Utilizado em sistemas com multi aplicações.

ApplicationUser

Associa usuários e aplicações.

AuditLog

Registra informações de eventos ocorridos no sistema.

Device

Registra dispositivos que acessaram o sistema mobile.

InvalidatedToken

Registra as informações dos tokens de usuários após efetuar logout da aplicação.

Classe Device

Tabela responsável por armazenar informações dos dispositivos móveis que acessaram o sistema mobile.

Coluna do Banco

Tipo

Função

Coluna do Banco

Tipo

Função

id  

Texto

Chave primária.

token  

Texto

Token do dispositivo.

platform  

Texto

Plataforma do dispositivo.

model  

Texto

Modelo do dispositivo.

platformVersion  

Texto

Versão da plataforma.

appName  

Texto

Nome da aplicação que acessou a base de dados.

appVersion  

Texto

Versão da aplicação que acessou a base de dados.

Classe AuditLog

Tabela responsável por armazenar informações de eventos ocorridos no sistema, gerando um histórico dessas alterações. Para mais detalhes, consulte a documentação Log de Auditoria.

Coluna do Banco

Tipo

Função

Coluna do Banco

Tipo

Função

id  

Inteiro

Identificador numérico do registro.

type

Texto

Recurso que gerou aceso.
Ex: app.entity.Entity, blocky.FolhaPagamento

command  

Texto

Comando utilizado.
Ex: UPDATE, DELETE.

date

Data e Hora

Data e hora em que ocorreu o evento.

objectData

Texto Longo

Objeto acessado.

user

Texto

Chave estrangeira da tabela User.

host

Texto

Endereço que gerou o acesso.

agent

Texto

Browser utilizado.

server

Texto

Endereço do servidor.

affectedFields

Texto

Campos modificados.

category

Texto

Recurso que gerou o registro.
Ex: Authorization, Blockly ou DataSource

application

Texto

Chave estrangeira da tabela Application.

error

Texto

Log de erro, caso ocorra.

Classe InvalidatedToken

Tabela responsável por armazenar informações dos tokens de usuários que realizaram logout do sistema. Para mais detalhes, consulte a documentação Invalidação de tokens.

Coluna do Banco

Tipo

Função

Coluna do Banco

Tipo

Função

id  

Texto

Identificador do token do usuário.

expirationDate

Carimbo de Data e Hora

Data de expiração do token.

Menu superior

Nesse menu (Figura 2) se encontra todas as propriedades e ajustes do diagrama em si, como gerar a persistência, trocar de banco, filtros das classes, visões, etc.

Figura 2 - Menu superior do diagrama de classes

 

  1. Gerar camada de persistência: responsável por gerar as camadas entity e dao (ver mais detalhes no tópico "Java" em Estrutura de arquivos).

  2. Assistente de view para o diagrama: cria os formulários CRUD na camada view nas classes do diagrama.

  3. Gerar diagrama a partir do banco de dados: faz engenharia reversa a partir de um banco de dados cadastrado no projeto. Essa opção só fica disponível ao criar um segundo diagrama no projeto.

  4. Sincronizar Views: realiza engenharia reversa nas tabelas virtuais do banco de dados.

  5. Organizar elementos do diagrama: organiza toda a visualização das classes do diagrama.

  6. Detectar relacionamentos: sinaliza as classes geradas em relacionamentos NtoM.

  7. Exportar diagrama em: exporta o diagrama em dois formatos diferentes:

    • SVG

    • PDF

  8. Bloquear/Desbloquear Diagrama: impede alterações no diagrama.

  9. Zoom: ferramenta para aumentar ou diminuir zoom da área do diagrama.

  10. Banco de dados: selecionar o banco de dados que será trabalhado, já que algumas aplicações podem ter mais de um banco.

  11. Namespace: nome do espaço de trabalho

  12. Visão: escolher a visualização do diagrama a partir da visão selecionada, como por exemplo visão "produto", mostrará apenas as classes, relacionamentos que tem interação direta com produto. 

  13. Filtro por visão: filtrar as classes e relacionamentos que serão mostrados na visão, cria novas visões.

  14. Buscar: buscar controle, ferramenta.

Menu lateral

Nesse menu se encontram as ferramentas das classes, assim como seus aspectos (Figura 3).

Ao abrir um diagrama de dados na árvore de diretórios do Cronapp, você pode visualizar as diferentes classes associadas a esse diagrama. No menu lateral à direita da tela, estão disponíveis várias ferramentas para a criação e edição de classes. Na parte superior desse menu, encontra-se a aba Controles, seguida pelas abas Propriedades e Eventos e, por fim, Estrutura. Para adicionar uma nova classe ao diagrama, acesse a aba Controles, navegue até o submenu UML e arraste o componente Class para a área de edição. Após adicionar a classe, clique duas vezes sobre ela para abrir a janela de configuração, onde é possível definir o nome e os atributos da classe.
Menu lateral do diagrama de dados

Figura 3 - Menu lateral

 

  1. Controle: onde as ferramentas de relacionamentos e criação de novas classes se encontram.

    • Tools: ferramentas de relacionamento, para adicionar o relacionamento entre classes selecione o relacionamento, em seguida as classes que se relacionarão:

      • 1to1: cada uma das duas entidades envolvidas referência obrigatoriamente apenas uma unidade da outra.

      • 1toN: uma das entidades envolvidas pode referenciar várias unidades da outra, porém, do outro lado cada uma das várias unidades referenciadas só pode estar ligada uma unidade da outra entidade.

      • NtoM: neste tipo de relacionamento cada entidade, de ambos os lados, pode referenciar múltiplas unidades da outra.

    • Class: adiciona uma classe ao diagrama, basta arrastá-la para área do diagrama.

  2. Propriedades e eventos: ao selecionar uma classe do diagrama ou ligação entre duas classes, os campos do control abrirá algumas propriedades que podem ser alteradas, assim como eventos.

  3. Estrutura: exibe as classes existentes e seus relacionamentos com outras classes. Clique em uma classe para centralizá-la no diagrama, útil em grandes diagramas.

Estrutura da Classe

Ao criar uma classe você pode adicionar um nome e atribuir atributos. A manipulação da classe apresenta suas funcionalidades (Figura 4.1), como adição, remoção e edição de atributos, auditória em log; além disso, ela também apresenta as principais configurações de um atributo, como tipo, nome na coluna do banco, nome no formulário, se permite nulo ou não etc.

É possível adicionar atributos de armazenamento em quatro locais diferentes: Banco de Dados (não recomendado, confira o Manual de Boas Práticas), Dropbox, S3 (Amazon) ou Serviços de Cloud.

Figura 4.1 - Manipulação de classe

 

  1. Classe: nome que você escolherá para a classe.

  2. Database Table: nome que você escolherá para a tabela no banco de dados. Este campo só precisa ser usado se o nome da tabela tiver que ser diferente do nome da classe, caso contrário pode deixar em branco.

  3. Caixas de configuração:

    • Usar nomes reais do banco: ao gerar a camada de persistência das classes criadas do Diagrama, o Cronapp sempre tenta converter os nomes das classes para o padrão UperCamelCase, atributos para o padrão lowerCamelCase e retirar caracteres como underline “_”, com o objetivo de melhorar a legibilidade do código gerado. Porém, ao obter as classes a partir da engenharia reversa, pode ser necessário manter a mesma grafia das tabelas e colunas do banco de dados para permitir, por exemplo, reutilizar consultas SQL. Exemplo: atributo_1, NomeDoAtributo, LIVROS.

    • Auditoria em Log: permite a criação de log para essa tabela, veja mais informações na documentação.

    • Swagger/Open API: habilitar o recurso no Swagger nas entidades do diagrama de dados, veja mais informações na documentação.

  4. Pesquisar: pesquisa o atributo pelo ID.

  5. Adicionar: adiciona um novo atributo na classe.

  6. Atualizar: recarrega os campos dos atributos exibidos na grade.

  7. Atributo: campo para definir o nome do atributo na classe java. Quando esse é definido, automaticamente a coluna do banco e o rótulo recebem o mesmo nome.

  8. Coluna do Banco: nome do campo no banco de dados.

  9. Rótulo: rótulo do front-end. Nome da coluna que será exibida no CRUD gerado pelo Assistente de View para o Diagrama.

  10. Tipo: caixa de seleção para escolher o tipo do atributo, se ela será uma string, um inteiro, um date.

  11. Chave: define o campo como chave primaria da tabela, as chaves nunca se repetem na mesma tabela e, desta forma, podem ser usadas como um índice de referência para criar relacionamentos com as demais tabelas do banco de dados.

  12. Permite nulo: define se o campo permitirá valores nulos. Um campo nulo é um valor ausente ou indefinido em um banco de dados. Isso significa que não há nenhum valor atribuído ao campo.

  13. Não Permite Vazio: define se o campo permitirá valores vazios. Um campo vazio é um campo que contém uma string sem caracteres. Essa funcionalidade aplica-se somente aos tipos de dados Texto e Texto Longo.

  14. Editar: abre mais propriedades referentes ao atributo.

  15. Excluir: apaga o atributo selecionado.

  16. Permissão: ao clicar no ícone de um atributo você poderá alterar as permissões de CRUD e filtro para determinados perfis.

 

Ao clicar no botão de editar de um atributo, a janela de edição irá apresentar todas as configurações possíveis para o mesmo (Figura 4.2).

Figura 4.2 - Edição do atributo

 

  • Atributo: campo para definir o nome do atributo na classe Java. Quando esse é definido, automaticamente a coluna do banco e o rótulo recebem o mesmo nome.

  • Coluna do Banco: nome da coluna na tabela do banco de dados. (veja aqui como criar relacionamentos entre classes com chaves compostas).

  • Rótulo: rótulo do front-end. Nome da coluna que será exibida no CRUD gerado pelo Assistente de View para o Diagrama.

  • Tipo: caixa de seleção para escolher o tipo do atributo, por exemplo, string, inteiro, date, array de byte e outros.

  • Tipo de Definição no Banco: permite personalizar o tipo de um campo do banco de dados, quando este requer tipos de dados específicos e não suportado pelo padrão SQL ANSI, como o tipo "datetimeoffset" do SQL Server. Para mais detalhes, consulte a documentação do banco de dados utilizado.

  • Tamanho: tamanho do campo no banco de dados. Funciona de acordo com o tipo do campo adotado. Em campos do tipo string (varchar), essa coluna define a quantidade máxima de caracteres.

  • Precisão: quantidade total de algarismos aceitos em um campo do tipo numérico fracionado, contando a parte inteira e a parte fracionada.

  • Escala: quantidade de algarismos que será configurada para a parte fracionada no número.

  • Valor padrão: permite selecionar uma das opções de valor padrão ("Nova GUID", "Data Atual" ou "Data Atual (Milissegundos)"). Esse campo também aceita expressões Java.

  • Máscara: campo será configurado para ter a entrada rotulada com a expressão de máscara definida. Existem algumas máscaras padrões ou você poderá adicionar uma específica. Ex: uma máscara de telefone celular (99) 9 9999-9999.

  • Chave: define o campo como chave primaria da tabela, as chaves nunca se repetem na mesma tabela e, desta forma, podem ser usadas como um índice de referência para criar relacionamentos com as demais tabelas do banco de dados.

  • Único: marcando essa opção, o valor do campo será único na tabela.

  • Índice: aplica uma referência associada a um atributo, é utilizada para fins de otimização de desempenho em consultas com filtro de igualdade, permitindo uma localização mais rápida de um registro quando efetuada uma consulta.

  • Permite Nulo: define se o campo permitirá valores nulos. Um campo nulo é um valor ausente ou indefinido em um banco de dados. Isso significa que não há nenhum valor atribuído ao campo.

  • Não Permite Vazio: define se o campo permitirá valores vazios. Um campo vazio é um campo que contém uma string sem caracteres. Essa funcionalidade aplica-se somente aos tipos de dados Texto e Texto Longo.

  • Ignorar no REST: define se o campo poderá ser ignorado, não preenchido.

  • Tipo de PK: tipo do campo da chave primária. Contém opções de tratamento da chave primária. Podem ser selecionados os valores: 

    • Nenhum: não configura nenhum tratamento especial para o campo de chave primária. 

    • Auto Incremental: define a chave primária como um campo numérico sequencial e auto incremental que é controlado pelo banco de dados. O tipo do campo deverá ser selecionado como inteiro.
      Exemplos.: 1, 2, 3.

    • Nova GUID: define um conjunto de caracteres no padrão Universally Unique Identifier (UUID) gerados pelo servidor da aplicação, seu tipo deverá ser texto (java.lang.String (varchar)).
      Exemplo: "1d4e5d7b-dca8-4a1d-90fd-72648cf5dc8d".

  • Transitório: normalmente usados em atributos que passam por constantes modificações durante a aplicação. Atributos transitórios não geram campos na tabela, pois não participam da persistência e seus valores nunca são armazenados no banco de dados. Podem ser utilizados para realizar cache de atributos derivados de outros atributos, sendo possível configurar o seu retorno de forma high code na classe .java correspondente. Nesse caso, talvez seja preciso habilitar a "Compatibilidade do Cronapp com a versão 1.0", veja como habilitar no tópico "Origem dos Dados" na documentação da Fonte de Dados.
    No entanto, esse recurso era usado em versões antigas do Cronapp, por isso é recomendável utilizar campos calculados diretamente na fonte de dados, em vez de um atributo transitório. Verifique o tópico "Campos calculados" em Fonte de Dados

  • Pode Inserir: define que o atributo pode ser inserido.

  • Pode Atualizar: define que o atributo como editável.

  • Criptografar: define que o atributo será criptografado ao ser salvo em banco. O método de criptografia usado é o bcrypt, que gera um hash Blowfsh para o valor informado. Normalmente esse recurso é utilizado em campos de senha.

  • Política de senha: define a força dos campos de senha. 

    • Nenhum: permite que o usuário cadastre uma senha sem obedecer qualquer tipo de condição prévia, como por exemplo: quantidade de caracteres, caractere especial ou letras maiúsculas. 

    • Completo: só será possível cadastrar ou atualizar o campo se a sequência de caracteres atender os parâmetros das configurações avançadas da Política de senha (mais detalhes no tópico "Configuração Avançada" em Configurações do projeto). Essa opção criará um campo (“<nomeAtributo>_history”) na entidade para armazenar as últimas senhas e impedir que o usuário repita as últimas senhas utilizadas.

  • Coluna Referenciada: usado para informar manualmente o nome da coluna de chave primária referenciada por esta coluna de chave estrangeira. Esse campo não possui mais função em projetos novos, ainda é exibido apenas para manter compatibilidade em projetos antigos (Cronapp v1.0).

  • Sequência: esse campo espera receber o identificador de uma sequência criada diretamente no banco de dados. Em banco de dados, "sequence" são objetos criados afim de controlarmos os valores das chaves primárias. Veja mais detalhes sobre sequências na documentação do seu banco de dados, exemplo: Oracle e SQL Server.

  • Pesquisável: configura automaticamente o atributo como pesquisável na aplicação (campo Pesquisar da tela de CRUD).

  • Remover em Cascata: remove dados em cascata vinculados àquele campo. Útil em relacionamentos 1 to N. Ex: Entidades Pai e Filho, apagando um registro Pai, todos os registros Filhos relacionados serão excluídos automaticamente. Esse campo deve ser marcado no atributo da chave estrangeira da entidade Filho.

  • Coluna de Versão: versiona o objeto da entidade a partir das modificações que forem feitas em seus atributos.

  • Usar o Outer Join: essa propriedade permite gerar consultas e filtros entre entidades no formato outer join, ao invés de inner join. Dessa forma, é possível realizar uma consulta em uma entidade de relacionamento M para N mesmo que não exista relacionamento de chave estrangeira em um dos relacionamentos "pai". Para funcionar, essa propriedade deve ser marcada nas caixas de seleção dos atributos de chave estrangeira e propriedade Filtros e Parâmetros da Fonte de dados deve ser configurada.

  • Tipo de Armazenamento: selecione um dos locais de armazenamento na nuvem (Dropbox, S3 ou Serviços de Cloud). Esse campo ficará habilitado ao selecionar os Tipos "imagem no Cloud" ou "Arquivo no Cloud".

  • Id do Armazenamento: utilizado apenas para Selecionar a URL do Serviço de Cloud. Esse campo ficará habilitado ao selecionar os Tipos "imagem no Cloud" ou "Arquivo no Cloud".

  • Chave do Armazenamento: chave disponibilizada por uma das opções de armazenamento. Esse campo ficará habilitado ao selecionar os Tipos "imagem no Cloud" ou "Arquivo no Cloud".

  • Segredo do Armazenamento: segredo disponibilizado por uma das opções de armazenamento. Esse campo ficará habilitado ao selecionar os Tipos "imagem no Cloud" ou "Arquivo no Cloud".

  • Colunas de relacionamento: permite informar os campos físicos de ligação entre a tabela de origem e a tabela de destino, é possível informar múltiplos campos, separados por vírgula. Ex: fk_pessoa_id=id, fk_cpf=cpf. Caso o campo fique vazio, o sistema assumirá que a ligação é feita com a chave primária.

  • Região da AWS: permite selecionar a região onde está a conta do Amazon S3 (AWS)Esse campo ficará habilitado ao selecionar os Tipos "imagem no Cloud" ou "Arquivo no Cloud".

  • Nome da chave estrangeira: Usado em atributos de FK (Foreign Key), ele altera o campo "Constraint_name" da respectiva coluna na tabela do Banco de dados.

 

Acesse o tópico "Upload de arquivos" em Arquivo para mais detalhes sobre como configurar os tipos de atributos Arquivo ou Imagem.

Chave composta

Usamos chaves compostas quando precisamos de dois campos para compor um identificador único para um registro. No exemplo abaixo criamos uma classe cuja chave primária é constituída de 2 campos.  A classe "Tipo" contém dois atributos de chave primária, id_tipo e ano_tipo, e faz uma relação 1 para N com a classe "Cadastro", que possui o atributo de chave estrangeira tipo.

Inicialmente, após criar o relacionamento 1 (Tipo) para N (Cadastro) entre as classes, na janela Manipular Cadastro da classe Cadastro, o nome do atributo de chave estrangeira estará com o nome da classe relacionada (tipo) e na coluna "Coluna do Banco" estará como fk_tipo, para transformar essa chave estrangeira em uma chave estrangeira composta, é preciso adicionar as duas chaves primárias da primeira classe, separadas por ";" (ponto e vírgula), à coluna "Coluna do Banco" (destaque 1 da figura 4.3).

Figura 4.3 - Adição da chave composta

 

Importante

No diagrama, o relacionamento é feito entre as classes, e não entre os campos (atributos) como ocorre no banco de dados. Assim, no caso de chaves compostas é necessário informar manualmente os nomes das chaves no atributo de relação.

Tipos

A tabela abaixo apresenta a relação entre os tipos disponíveis no Cronapp e o que é gerado nas classes Java e no banco de dados.