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
No Cronapp, os diagramas de dados ficam no diretório Diagramas de Dados (Localização: Diagramas de dados/
Endereço: |
) 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
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 |
---|---|---|
User | Usuários. | Permissão de Segurança |
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. | Multi Aplicações |
ApplicationUser | Associa usuários e aplicações. | |
AuditLog | Registra informações de eventos ocorridos no sistema. | Log de Auditoria |
Device | Registra dispositivos que acessaram o sistema mobile. | Dispositivos mobile |
InvalidatedToken | Registra as informações dos tokens de usuários após efetuar logout da aplicação. | Invalidação de tokens |
Tabela responsável por armazenar informações dos dispositivos móveis que acessaram o sistema mobile.
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. |
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 |
---|---|---|
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. |
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 |
---|---|---|
id | Texto | Identificador do token do usuário. |
expirationDate | Carimbo de Data e Hora | Data de expiração do token. |
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
Nesse menu se encontram as ferramentas das classes, assim como seus aspectos (Figura 3).
Figura 3 - Menu lateral
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
atributo_1, NomeDoAtributo, LIVROS.
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
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.
Para deixar o atributo sem limites de caracteres, configure-o com o valor 0. |
Escala: quantidade de algarismos que será configurada para a parte fracionada no número.
As colunas Precisão e Escala somente são habilitadas à escrita quando o tipo do atributo escolhido na coluna Tipo for correspondente a um tipo numérico fracionado. Ex. Double, Long etc. |
1
, 2
, 3
.1d4e5d7b-dca8-4a1d-90fd-72648cf5dc8d
"..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. Pode Inserir: define que o atributo pode ser inserido.
nomeAtributo_history
”> na classe java e uma coluna, com o mesmo nome do atributo, na tabela relacionada a Classe. Objetivo é impedir que o usuário altere a sua senha para as duas últimas senhas utilizadas anteriormente.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".
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.Acesse o tópico "Upload de arquivos" em Arquivo para mais detalhes sobre como configurar os tipos de atributos Arquivo ou Imagem. |
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
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. |
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.
Tipo Cronapp | Classe Java | Correspondente no Banco ** | Descrição |
---|---|---|---|
Texto (string) | String | Firebird, H2, MySQL, Oracle, Postgres, SQL Server: VARCHAR. | Armazena um conjunto de caracteres. |
Texto Longo (Long text) | String | Firebird: BLOB SUB_TYPE TEXT. H2, MySQL, Postgres, SQL Server: TEXT Oracle: CLOB. | Armazena um conjunto de caracteres com tamanho máximo de 4GB. |
UUID | String | Firebird, H2, MySQL, Oracle, Postgres, SQL Server: VARCHAR. PostgreSQL: UUID (tipo nativo PostgreSQL). | Utilizado para tratar o tipo UUID do banco PostgreSQL durante a engenharia reversa. Ao criar uma tabela pelo Cronapp (camada de persistência) utilizando o tipo UUID, o tipo gerado para o campo em todos os bancos de dados será sempre Varchar. Além disso, ao selecionar essa opção, a propriedade Tipo da PK é automaticamente configurada com a opção "Nova GUID". |
Lógico (Boolean) | Boolean | Firebird: SMALLINT. H2: BOOLEAN MySQL: TINYINT. Oracle: NUMBER. Postgres: BOOL. SQL Server: BIT. | Permite que o atributo armazene somente um de dois estados: true ou false. |
Caracter (Character) | Character | Firebird: VARCHAR. H2, Oracle, MySQL, SQL Server: CHAR. Postgres: BPCHAR. | Armazena somente um caractere alfanumérico. |
Numérico (Numeric) | Double | Firebird: DOUBLE PRECISION. H2, MySQL: DOUBLE. Oracle: NUMBER. Postgres, SQL Server: FLOAT. | Armazena tanto números inteiros quanto fracionários no padrão da IEEE 754. |
Inteiro (Integer) | Integer | Firebird, H2, SQL Server: INTEGER. MySQL: INT. Oracle: NUMBER. Postgres: INT4. | Armazena números inteiros entre -2,147,483,648 à 2,147,483,647. |
Inteiro Longo (Long Integer) | Long | Firebird, SQL Server: NUMERIC. H2, MySQL: BIGINT. Oracle: NUMBER. Postgres: INT8. | Armazena números inteiros entre - 263 à 263 - 1. |
Decimal Grande (Big Decimal) | BigDecimal | Firebird, H2, Postgres, SQL Server: NUMERIC. MySQL: DECIMAL. Oracle: NUMBER. | Armazena tanto números inteiros quanto fracionários. |
Inteiro Grande (Big Integer) | BigInteger | Firebird, H2, SQL Server: NUMERIC. MySQL: BIGINT. Oracle: NUMBER. Postgres: INT8. | Armazena números inteiros que são maiores que Integer ou Long. |
Inteiro Curto (Short) | Short | Firebird, H2, MySQL, SQL Server: SMALLINT. Oracle: NUMBER. Postgres: INT2. | Armazena números inteiros entre -32,768 à 32,767. |
Byte | Byte | Firebird, H2, SQL Server: SMALLINT. MySQL: TINYINT. Oracle: NUMBER. Postgres: INT2. | Armazena números inteiros entre -32,768 à 32,767. |
Data (Date) | Date | Firebird, H2, MySQL, Oracle, Postgres: DATE. SQL Server: DATETIME. | Armazena data (data, mês e ano). |
Data e Hora (Date and Time) | Date | Firebird, H2, Oracle, Postgres: TIMESTAMP. MySQL: DATETIME. SQL Server: DATETIME2. | Armazena tanto a data quanto a hora. |
Carimbo de Data e Hora (Timestamp) | Date | Firebird, H2, MySQL, Oracle, Postgres: TIMESTAMP. SQL Server: DATETIME2. | Armazena tanto a data quanto a hora. |
Hora (Time) | Date | Firebird, H2, MySQL, Postgres: TIME. Oracle: TIMESTAMP. SQL Server: DATETIME. | Armazena hora (hora, minuto e segundo). |
Binário (Binary) | * | Firebird: BLOB SUB_TYPE BINARY. H2: LONGVARNIBARY. MySQL: LONGBLOB. Oracle: BLOB. Postgres: BYTEA. SQL Server: BINARY. | Armazena o dado em formato binário. |
Arquivo no Banco (Database File) | * | Firebird: BLOB SUB_TYPE BINARY. H2: LONGVARNIBARY. MySQL: LONGBLOB. Oracle: BLOB. Postgres: BYTEA. SQL Server: VARBINARY. | Armazena arquivos no banco de dados usado em seu projeto no Cronapp. |
Arquivo no Cloud (Cloud File) | * | Firebird, H2, MySQL, Oracle, Postgres, SQL Server: VARCHAR. | Armazena arquivos na nuvem (Dropbox, S3 Amazon ou Serviços de Cloud) e salva em banco a sua URI. |
Imagem no Banco (Database Image) | * | Firebird: BLOB SUB_TYPE BINARY. H2: LONGVARNIBARY MySQL: LONGBLOB. Oracle: BLOB. Postgres: BYTEA. SQL Server: IMAGE. | Armazena imagens no banco de dados usado em seu projeto no Cronapp. |
Imagem no Cloud (Cloud Image) | * | Firebird, H2, MySQL, Oracle, Postgres, SQL Server: VARCHAR. | Armazena imagens na nuvem (Dropbox, S3 Amazon ou Serviços de Cloud) e salva em banco a sua URI. |
Versão (Row Version) | Long | Firebird, H2, MySQL, Oracle, Postgres: VARCHAR. | Atributo usado para fazer controle de atualização. |
XML | Byte | Firebird, H2, MySQL, Oracle, Postgres: VARCHAR. SQL Server: XML. | Armazena documentos ou fragmentos XML |
Classe (Chave estrangeira / Foreign Key) | - | Foreign Key | Apresenta a(s) classe(s) existentes no diagrama para gerar a chave estrangeira dessas tabelas. |
* Não é uma classe Java, mas sim um dado primitivo. Byte[] - um array de byte.
** Os tipos correspondentes dos bancos de dados podem variar a depender da versão do Banco de dados, do driver jdbc utilizado ou se o atributo é uma chave primária (PK), em caso de dúvida, recomendamos verificar a documentação do seu banco de dados.
Esse campo permite definir uma regra para alimentar o valor do atributo selecionado sempre que o objeto for criado. Além das opções de chave única (GUID), Data Atual e Data Atual (Milissegundos), esse campo também aceita expressões Java.
Por exemplo, ao inserir a expressão "new Random().nextInt(26)
", sempre que o objeto for iniciado, o atributo selecionado receberá um valor aleatório entre "0" e "25". É importante ficar atento ao campo Tipo, pois no exemplo da expressão randômica, a expressão Java retornará um inteiro, logo, será necessário selecionar um tipo compatível com o retorno da expressão ou opção.
Opção | Tipos aceitos | O que faz |
---|---|---|
Nova GUID |
| Gera um valor único e universal (Universally Unique Identifier (UUID)). |
Data e Hora |
| Obtém a data e hora atual e alimenta o atributo com base no Tipo selecionado. |
Data e Hora (Milissegundos) |
| Retorna um valor no formato Inteiro longo com a data e hora atual em milissegundos. Essa opção foi incluída para atender o tipo "versão" do banco de dados SQL Server, que requer um Timestamp no formato de Inteiro longo. |
Por padrão, a IDE utiliza o método de junção Inner Join ao relacionar 2 classes (M - N), com isso, se uma das chaves estrangeiras estiver nula, ao pesquisar, ele não irá aparecer no filtro, que exibirá apenas os registros que contenha todas as colunas de chave estrangeira preenchidas. Portanto, para exibir todos os registros do filtro, mesmo que algum relacionamento esteja nulo (formato Outer Join), é necessário configurar os atributos de relacionamento e o filtro da fonte de dados no formulário.
No exemplo abaixo vamos criar um relacionamento M para N ( Cliente - Venda - Produto ) (Figura 5.1) e usar o filtro da tela de CRUD Vendas.
Para usar o Outer Join, é necessário abrir a janela de edição do atributo de chave estrangeira da classe de relacionamento (Venda) e ativar a caixa Usar Outer Join (Figura 5.1). No exemplo abaixo, ativamos a opção Usar Outer Join nos atributos Comprador e produtoVendido da classe Venda. Após isso, gere a camada de persistência e crie as views das 3 classes.
Figura 5.1 - Ativando a opção Usar Outer Join nos atributos de chave estrangeira
Após isso, abra a view da classe de relacionamento (Venda), selecione a Fonte de dados principal e, em seguida, clique em "..." da propriedade Filtros e Parâmetros. Siga os passos da figura 5.2:
Figura 5.2 - Configurando a propriedade Filtros e Parâmetros da fonte de dados principal
Após executar o projeto, adicione alguns registros nas páginas cliente e produto. Em seguida, acesse a página venda para incluir registros de vendas, relacionando cliente e produtos. Por fim, digite algo no campo de pesquisa para exibir os registros de vendas, mesmo que um comprador não possua um produto relacionado (nulo) ou um produto relacionado não possua um comprador (nulo). Ao pesquisar por "ma" no exemplo da figura abaixo, o produto "Macarrão" foi exibido mesmo não possuindo um Comprador (cliente) relacionado.
Figura 5.3 – Resultado do filtro com o outer join
Essa propriedade permite definir um atributo da classe para trabalhar como versionador do registro, incrementando seu valor automaticamente a cada modificação do registro. Exemplo: Entidade Empresa possui os atributos ID, nome e versao (campo usado para versionar), sempre que o nome da empresa for alterado (Exemplo da figura abaixo, o valor “Cronapp” foi alterado para “Cronapp LowCode”), o atributo versão será incrementado automaticamente, informando quantas alterações foram feitas.
Requisitos para a coluna de versão:
Figura 6 - Exemplo de incremento na coluna versionada após alterar algum campo no registro
Abaixo estão listadas as máscaras pré-definidas e os tipos compatíveis da janela de atributos. O campo de máscara permite personalização. Para saber mais sobre máscaras, acesse a documentação: Formatação de máscaras na camada cliente.
Máscara | Tipos compatíveis |
---|---|
CPF | texto ou texto longo. |
CNPJ | texto ou texto longo. |
CEP | texto ou texto longo. |
Telefone | texto ou texto longo. |
Hora | hora, data e hora ou carimbo de data e hora. |
Data | data, data e hora ou carimbo de data e hora. |
Data e hora | data, hora, data e hora ou carimbo de data e hora. |
Semana | data, data e hora ou carimbo de data e hora. |
Mês | data, data e hora ou carimbo de data e hora. |
Moeda | texto, texto longo, inteiro ou numérico. |
Inteiro | texto, texto longo, inteiro ou numérico. |
Numérico | texto, texto longo, inteiro ou numérico. |
Ao clicar com o botão direito em cima da classe, um menu aparecerá com algumas opções.
Figura 7 - Janela da classe
Quando um diagrama é criado e é gerado sua camada de persistência, é criado um diretório (Namespace) com o nome do diagrama contendo as camadas dao e o entity (Endereço: src/main/java/
)(1 da figura 8). o arquivo persistence.xml (Endereço: src/main/java/META-INF/persistence.xml
) também é atualizado contendo o diagrama criado (2).
Para localizar o arquivo persistence.xml e os arquivo entity e dao, é necessário que o Modo Avançado esteja habilitado. |
Figura 8 - Arquivos gerados após criar a camada de persistência
Após clicar para remover o diagrama, será exibido uma janela perguntando se também deseja excluir a camada de persistência junto ao diagrama, caso você clique em OK, o Namespace com os diretórios dao e entity serão excluídos e o arquivo persistence.xml será modificado.
Figura 8.1 - Excluindo Diagrama e Camada de persistência
Após confirmar a ação de remover a camada de persistência (figura 8.1), o Namespace "biblioteca
" será excluído (destaque 1 da figura 8) e o arquivo persistence.xml
atualizado (destaque 2 da figura 8).
Relacionamento entre classes (destaque 1 da figura 9) podem ficar sobrepostos em cima de outras classes, caso o diagrama possua muitas classes, dificultando a visualização dos relacionamentos. Assim, é possível "quebrar" a linha para estruturar da maneira que preferir, como mostrado abaixo.
Figura 9 - Dobrando linhas do relacionamento
Nesta Página
Conteúdo complementar
Assista sobre o tema no Cronapp Academy
Caso seja seu primeiro acesso ao Cronapp Academy, crie antes uma conta gratuita e matricule-se no curso abaixo. |