Versões comparadas
Chave
- Esta linha foi adicionada.
- Esta linha foi removida.
- A formatação mudou.
O arquivo populate.json (Endereço: src/main/java/app/populate.json
) possui vários registros das entidades da estrutura de segurança do Cronapp, como User
, Securable
e Role
. Seu objetivo é popular o Banco de dados do projeto com uma base de dados mínima. Assim, um projeto recém-criado no Cronapp pode ser imediatamente executado e sua aplicação será funcional, um usuário Administrador já estará disponível para logar (usuário e senha: "admin") nas aplicações web e mobile.
Não é necessário manipular esse arquivo e não recomendamos que o faça, seu conteúdo é editável de forma low-code através da ferramenta Permissão de segurança. O relacionamento entre as classes e a estrutura de segurança do Cronapp são apresentados na documentação Permissão de segurança.
Essa documentação apresenta a estrutura do arquivo populate.json
apenas para conhecimento, mas não incentivamos a sua manipulação. Como se trata de um conteúdo high-code, a manipulação do código é de responsabilidade do usuário.
Aviso |
---|
Tenha cuidado ao adicionar publicamente seu projeto em sistemas de controle de versões, como GitHub, bitbucket, GitLab e outros, pois os dados informados no arquivo ficarão expostos. |
Informações |
---|
O arquivo
|
Image Added
Figura 1 - Arquivo populate.json
Nota | ||
---|---|---|
| ||
O valor do campo |
Estrutura
Nesse exemplo vamos mostrar como alimentar as entidades criadas no Diagrama de dados e como ocorre as interações de relacionamentos no arquivo populate.json
.
Necessário:
- Criar a camada de persistência das classes.
- Para alimentar o campo
id
, sugerimos utilizar algum site para gerar UUID para os identificadores.
Entidade
O primeiro exemplo a ser utilizado será da classe "Anime" que não possui relacionamentos (Figura 2). Essa classe possui quatro campos:
- id: tipo TEXTO.
- titulo: tipo TEXTO.
- episodio: tipo INTEIRO.
- completo: tipo LÓGICO.
Image Added
Figura 2 - Classe sem relacionamento
Para inserir dados nessa classe através do arquivo, você precisa especificar a classe e todos os seus campos nos atributos do objeto JSON. Para indicar a classe, é necessário informar a chave "_class
" e o seu valor será o "caminho" (Figura 2.2) onde encontra a classe ("<namespace>.<pacote>.<nomedaclasse>
" - sem a extensão .java
). No exemplo da figura 2.1, ele ficará do seguinte modo: "_class" : "app.entity.Anime
".
Image Added
Figura 2.1 - Caminho: namespace.pacote.classe
Os demais atributos do objeto devem ser incluídos da mesma forma, através do par "chave":"valor"
. Além disso, os valores dos atributos da classe precisam estar em conforme com os tipos definidos, seguindo o padrão dos atributos JSON, ou seja, String possui aspas duplas, já Números e Boleano não (veja mais detalhes em JSON).
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
{
"_class" : "app.entity.Anime",
"id": "7A0DCC99-668B-4E28-8EE0-90D607CDAB5D",
"titulo": "Naruto",
"episodio": 700,
"completo": true
} |
Duas coisas importantes (padrão JSON):
- Como estamos enviando um array de objetos, o par de colchetes é usado uma única vez no arquivo, ele vai englobar todos os objetos.
- Cada objeto e cada atributos devem ser separados por vírgulas.
Relacionamentos 1-1 e 1-N
Tanto no relacionamento 1-1 quanto 1-N, a ordem como são apresentados os objetos no arquivo populate.json
tem fundamental importância, o objeto que possui a chave primária do relacionamento deve ser inserido primeiro e só depois o objeto que possui a chave estrangeira relacionada. Por exemplo, na figura 2.2 a tabela Cliente carrega a chave estrangeira da tabela Carro, dessa forma, no arquivo JSON, o objeto Carro precisa ser inserido primeiro que o objeto Cliente, evitando que seja inserido no banco uma chave estrangeira sem que exista ainda a chave primária da outra tabela.
Para saber mais sobre a tabela de relacionamentos 1-1 e 1-N no Cronapp, consulte a página: Relacionamento entre classes no CRUD
Image Added
Figura 2.2 - Relacionamento 1-1
Caso a ordem seja invertida, durante a execução do projeto será exibida no console uma exceção parecida com a do bloco abaixo:
Aviso | ||
---|---|---|
| ||
Internal Exception: org.h2.jdbc.JdbcSQLException: Constraint "FK_CLIENTE_fk_carro" already exists; SQL statement: ALTER TABLE "CLIENTE" ADD CONSTRAINT |
Populate.json é um arquivo em formato JSON que serve para popular automaticamente entidades JPA. Esse arquivo já é criado automaticamente nos projetos do Cronapp, ele é utilizado com o intuito de popular a entidade User com os dados do admin e, com isso, poder dá acesso a página que somente os usuários autenticados podem utilizar. No entanto, caso queira adicionar outros dados para popular as tabelas automaticamente, fique a vontade.
Antes de utilizar o arquivo, você precisa ter preparado as seguintes situações:
- Criado a camada de persistência das classes;
- Algum programa ou site para gerar UUID para os identificadores.
Aviso | ||
---|---|---|
| ||
Trabalhar com versionamento e realizar commits tornam esses dados que estão inseridos nesses arquivos expostos para todos que tiverem acesso. |
Image Removed
Figura 1 - Arquivo populate.json
Utilizando o populate.json
Será apresentado um exemplo geral, utilizando uma classe sem nenhum relacionamento para demonstrar a estrutura de como realiza a inserção dos dados através desse arquivo. Após, serão apresentados exemplos para cada tipo de relacionamento para mostrar suas diferenças (ou suas especificações).
Estrutura básica
O primeiro exemplo a ser utilizado será da classe da Figura 2.1. Essa classe possui quatro campos:
- id: tipo TEXTO;
- titulo: tipo TEXTO;
- episodio: tipo INTEIRO;
- completo: tipo LOGICO.
Image Removed
Figura 2.1 - Classe sem relacionamento
Para inserir dados nessa classe através do arquivo, você precisa especificar a classe e todos os seus campos. Para indicar a classe, você adiciona a chave "_class" e o seu valor é o "caminho" (Figura 2.2) onde encontra a classe ("namespace.pacote.nomedaclasse" - sem a extensão .java). No exemplo da figura 2.2, ele ficará do seguinte modo: "_class" : "app.entity.Anime".
Image Removed
Figura 2.2 - Caminho: namespace.pacote.classe
Assim como a descrição da classe, os seus campos também são especificados da mesma maneira - por chave / valor. No entanto, a diferença fica por conta do _ (underline) que não existe nas chaves referenciadas dos campos - como mostrado abaixo. Além disso, os valores dos atributos inseridos na classe precisam estar em conforme com os tipos dos campos no banco.Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
{
"_class" : "app.entity.Anime",
"id": "7A0DCC99-668B-4E28-8EE0-90D607CDAB5D",
"titulo": "Naruto",
"episodio": 700,
"completo": true
} |
Duas coisas importantes: como estamos enviando um array de objetos, o par de colchetes é usado uma única vez no arquivo, ele vai englobar todos os objetos e cada objeto e também seus atributos devem ser separados por vírgulas.
Relacionamentos 1-1 e 1-N
Tanto no relacionamento 1-1 quanto 1-N, a ordem como são apresentados os objetos no arquivo tem fundamental importância - pois o detalhe se encontra na chave estrangeira. O objeto que possui a chave primária do relacionamento deve ser inserido primeiro e só depois o objeto que possui a chave estrangeira. Por exemplo, na figura 2.3 a tabela Cliente carrega a chave estrangeira da tabela Carro, dessa forma, no arquivo JSON, o objeto Carro precisa ser inserido primeiro que o objeto Cliente, evitando que seja inserido no banco uma chave estrangeira sem que exista ainda a chave primária da outra tabela.
Image Removed
Figura 2.3 - Relacionamento 1-1
Caso a ordem seja invertida, durante a execução do projeto será exibida no console uma exceção parecida com a do bloco abaixo:
Bloco de código | ||||
---|---|---|---|---|
| ||||
Internal Exception: org.h2.jdbc.JdbcSQLException: Constraint "FK_CLIENTE_fk_carro" already exists; SQL statement: ALTER TABLE "CLIENTE" ADD CONSTRAINT "FK_CLIENTE_fk_carro" FOREIGN KEY (fk_carro) REFERENCES "CARRO" (id) [90045-197] |
A inserção da chave estrangeira no objeto é bem simples, basta indica o nome da chave primária do outro objeto e o seu valor entre chaves. Na figura 2.
2, a chave estrangeira recebe o nome da classe, então ele ficará do seguinte modo:
Sintaxe:
"_class": "classe",
"chave primária da classe
": "valor da chave primária",
"classe relacionada": {"chave primária da classe relacionada": "valor da chave primária"}
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
{
"_class": "app.entity.Carro",
"id": "3AA6CAF2-ACB3-4A45-9C53-03FD2FE7A393",
"marca": "Lexus",
"modelo": "LFA",
"placa": "DEB7I94"
},
{
"_class": "app.entity.Cliente",
"id": "AF498375-FCC6-4197-8B04-C7F3EC7E8D2C",
"nome": "Deborah",
"cpf": "60694536032",
"carro": {"id": "3AA6CAF2-ACB3-4A45-9C53-03FD2FE7A393"}
} |
Relacionamento N-M
Da mesma forma que o relacionamento 1-1 ou 1-N, os objetos que não possuem a chave estrangeira precisam ser adicionados primeiros para depois adicionar o objeto que a carrega - nesse caso, será o objeto referente a classe de associação. Por exemplo, para a figura 2.4, precisam ser adicionados no JSON os objetos referentes as classes Ator e Filme para depois adicionar o objeto referente a classe AtorFilme.
Da mesma forma que o relacionamento 1-1 ou 1-N, os objetos que possuem a chave primária precisam ser adicionados primeiros para depois adicionar o objeto com a chave estrangeira do relacionamento - nesse caso, será o objeto referente a classe de associação. Para o exemplo da figura 2.4, precisam ser adicionados no JSON os objetos referentes as classes Ator e Filme para depois adicionar o objeto referente a classe AtorFilme.
Image Removed
Figura 2.4 - Relacionamento N-M
-ACB3-4A45-9C53-03FD2FE7A393"}
} |
Duplo relacionamento 1 - N
A figura abaixo mostra como fica os objetos do arquivo populate com o mesmo objeto se relacionando duas vezes com outra classe. Nesse caso, a classe Negocio
só guarda as chaves estrangeiras da classe Pessoa
.
Image Added
Figura 2.3 - Duplo relacionamento 1-N
SintaxeA forma de inserir a chave estrangeira também é a mesma que no relacionamento 1-1 ou 1-N, mas nesse caso as chaves se encontram na classe AtorFilme - então ela ficará do seguinte modo:
"_class": "classe
",
"chave primária da classe": "valor da chave primária",
"classe relacionada 1": {"chave primária da classe relacionada 1": "valor da chave primária 1"},
"classe relacionada
1": {"chave primária da classe relacionada
1": "valor da chave primária 2"}
Bloco de código | |||||||
---|---|---|---|---|---|---|---|
| |||||||
{ "_class": "app.entity.Pessoa", "id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D", "nome": "Mayumi" }, { "_class": "app.entity.AtorPessoa", "id": "66130FE812033AAB-F8DCDC75-48874E85-B8159994-A35E42EC0BB480A74824FEDA", "atornome": "Orlando BloomDeborah" }, { "_class": "app.entity.FilmePessoa", "id": "1C17F46FDB1A914C-F17632B6-4E904453-BABFB773-52AD3B3E4AEA83764D773F5B", "titulonome": "Piratas do CaribeRodrigo" }, { "_class": "app.entity.AtorFilmeNegocio", "id": "9522FDA243A654F2-65E23736-4E41448D-811CB645-22F2CBC818D78233FE2C066B", "atorcomprador": {"id": "66130FE867C9F4D1-F8DC2231-48874904-B81594DD-A35E42EC0BB4CDE0E888A17D"}, "filmevendedor": {"id": "1C17F46FDB1A914C-F17632B6-4E904453-BABFB773-52AD3B3E4AEA83764D773F5B"} }, { "_class": "app.entity.FilmeNegocio", "id": "E5AE7B60D7AE6195-2EE9F31E-40254AF2-9021AC10-5755510AFE2116A798165AA1", "titulo": "O senhor dos anéis""comprador": {"id": "12033AAB-DC75-4E85-9994-80A74824FEDA"}, "vendedor": {"id": "DB1A914C-32B6-4453-B773-83764D773F5B"} }, { "_class": "app.entity.AtorFilmeNegocio", "id": "9522FDA2802254BF-65E2F64A-4E414185-811CB05A-22F2CBC818D74373ECE31014", "atorcomprador": {"id": "66130FE812033AAB-F8DCDC75-48874E85-B8159994-A35E42EC0BB480A74824FEDA"}, "filmevendedor": {"id": "E5AE7B6067C9F4D1-2EE92231-40254904-902194DD-5755510AFE21CDE0E888A17D"} } |
Autorrelacionamento
Da mesma forma que os relacionamento 1-1, 1-N eRelacionamento N-M
, os autorrelacionamento seguem a mesma linha: primeiro insere os objetos que não carregam a chave. O detalhe tá na inserção da chave estrangeira, ela precisa ser a última a ser inserida no objeto.Da mesma forma que o relacionamento 1-1 ou
Image Removed
Figura 2.5 - Classes com autorrelacionamento
O bloco abaixo mostra como fica os objetos do arquivo JSON para inserção de uma classe com autorrelacionamento1-N, os
dados são para o exemplo da Figura 2.5 (classe SNSD).objetos que não possuem a chave estrangeira precisam ser adicionados primeiros para depois adicionar o objeto que a carrega - nesse caso, será o objeto referente a classe de associação. Por exemplo, para a figura 2.4, precisam ser adicionados no JSON os objetos referentes as classes Ator
e Filme
para depois adicionar o objeto referente a classe AtorFilme
.
Image Added
Figura 2.4 - Relacionamento N-M
A forma de inserir a chave estrangeira também é a mesma que no relacionamento 1-1 ou 1-N, mas nesse caso as chaves se encontram na classe AtorFilme
- então ela ficará do seguinte modo:
Sintaxe:
"_class": "classe associativa",
"chave primária da classe": "valor da chave primária",
"classe relacionada 1": {"chave primária da classe relacionada 1": "valor da chave primária 1"},
"classe relacionada 2": {"chave primária da classe relacionada 2": "valor da chave primária 2"}
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
Bloco de código | ||||||
| ||||||
{ "_class": "app.entity.SNSD", "id": "48631515-F532-4674-BF30-7C0A3D92882C", "integrante": "Kim Taeyeon", "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"} }, { "_class": "app.entity.SNSD", "id": "F7F1D934-EF30-4FF2-B6EB-631A0E75DADE", "integrante": "Jessica Jung", "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"} }, { "_class": "app.entity.SNSDAtor", "id": "EAF777F366130FE8-3980F8DC-43404887-A683B815-91875813D653A35E42EC0BB4", "integranteator": "Tiffany Hwang", "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"}Orlando Bloom" } |
O bloco abaixo mostra como fica os objetos do arquivo JSON para inserção de uma classe com autorrelacionamento N-M, os dados são para o exemplo da Figura 2.5 (classe grupo).
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
, { "_class": "app.entity.GrupoFilme", "id": "67C9F4D11C17F46F-2231F176-49044E90-94DDBABF-CDE0E888A17D52AD3B3E4AEA", "grupotitulo": "SNSDPiratas do Caribe" }, { "_class": "app.entity.GrupoAtorFilme", "id": "9522FDA2-65E2-4E41-811C-22F2CBC818D7", "ator": {"id": "12033AAB66130FE8-DC75F8DC-4E854887-9994B815-80A74824FEDAA35E42EC0BB4"}, "grupofilme": {"id": "TTS"1C17F46F-F176-4E90-BABF-52AD3B3E4AEA"} }, { "_class": "app.entity.GrupoFilme", "id": "DB1A914CE5AE7B60-32B62EE9-44534025-B7739021-83764D773F5B5755510AFE21", "grupotitulo": "SMTownO Senhor dos Anéis" }, { "_class": "app.entity.GrupoGrupoAtorFilme", "id": "9522FDA2-65E2-4E41-811C-22F2CBC818D7", "ator": {"id": "43A654F266130FE8-3736F8DC-448D4887-B645B815-8233FE2C066BA35E42EC0BB4"}, "grupofilme": {"id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D"}, "grupo_1": {"id": "DB1A914C-32B6-4453-B773-83764D773F5B"} }, { E5AE7B60-2EE9-4025-9021-5755510AFE21"} } |
Auto relacionamento
Os objetos com auto relacionamentos devem ser iniciados com um objeto que não possua relacionamento ou que se relacione com ele mesmo, nesse caso, a inserção do atributo de chave estrangeira precisa ser inserida por último no objeto.
Para saber mais sobre a tabela de auto relacionamento no Cronapp, consulte a página: Relacionamento entre classes no CRUD.
Image Added
Figura 2.5 - Classes com auto relacionamento
Sintaxe:
"_class":
"
classe",
"chave primária da classe": "valor da chave primária",
"classe relacionada": {"chave primária da classe": "valor da chave primária"}
O bloco abaixo mostra como fica os objetos do arquivo JSON para inserção de uma classe com auto relacionamento 1-N, os dados são para o exemplo da Figura 2.5 (classe Grupo).
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
"D7AE6195-F31E-4AF2-AC10-16A798165AA1", "grupo": {"id": "12033AAB-DC75-4E85-9994-80A74824FEDA"}, "grupo_1": {"id": "DB1A914C-32B6-4453-B773-83764D773F5B"} }, { "_class": "app.entity.GrupoGrupoGrupo", "id": "802254BF48631515-F64AF532-41854674-B05ABF30-4373ECE310147C0A3D92882C", "grupointegrante": {"id"Kim Taeyeon", "grupo": "12033AAB-DC75-4E85-9994-80A74824FEDA"}SNSD", "grupo_1lider": { "id": "67C9F4D148631515-2231-4904-94DD-CDE0E888A17D"} } |
Arquivo final
Por fim, vamos dá uma olhada em como ficará o conteúdo do populate.json com todos esses dados (contando com os dados do admin).
Bloco de código | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
[ F532-4674-BF30-7C0A3D92882C"} }, { "_class": "app.entity.User.Grupo", "id": "F7F1D934-EF30-4FF2-B6EB-631A0E75DADE", "integrante": "Jessica Jung", "grupo": "SNSD", "lider": { "id": "304BF43E48631515-0E62F532-4F4A4674-8A63BF30-3F22D7AD46117C0A3D92882C"} }, { "name_class": "adminapp.entity.Grupo", "loginid": "adminEAF777F3-3980-4340-A683-91875813D653", "passwordintegrante": "$2a$10$LjzpM1Q3VoAtG2dTCCabNuW0/amVPjL3Iyvyi2Dj7NP.HngtzSewu" }, { "_classTiffany Young", "grupo": "app.entity.RoleSNSD", "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"} } |
Arquivo final
No bloco abaixo exibimos todos os objetos apresentados nesse documento. Não exibimos os objetos das entidades da estrutura de segurança do Cronapp.
Bloco de código | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
[Administrators", "user": { "id" : "304BF43E-0E62-4F4A-8A63-3F22D7AD4611" } }, { "_class" : "app.entity.Anime", "id": "7A0DCC99-668B-4E28-8EE0-90D607CDAB5D", "titulo": "Naruto", "episodio": 700, "completo": true }, { "_class": "app.entity.Carro", "id": "3AA6CAF2-ACB3-4A45-9C53-03FD2FE7A393", "marca": "Lexus", "modelo": "LFA", "placa": "DEB7I94" }, { "_class": "app.entity.Cliente", "id": "AF498375-FCC6-4197-8B04-C7F3EC7E8D2C", "nome": "Deborah", "cpf": "60694536032", "carro": {"id": "3AA6CAF2-ACB3-4A45-9C53-03FD2FE7A393"} }, { "_class": "app.entity.Ator", "id": "66130FE8-F8DC-4887-B815-A35E42EC0BB4", "ator": "Orlando Bloom" }, { "_class": "app.entity.Filme", "id": "1C17F46F-F176-4E90-BABF-52AD3B3E4AEA", "titulo": "Piratas do Caribe" }, { "_class": "app.entity.AtorFilme", "id": "9522FDA2-65E2-4E41-811C-22F2CBC818D7", "ator": {"id": "66130FE8-F8DC-4887-B815-A35E42EC0BB4"}, "filme": {"id": "1C17F46F-F176-4E90-BABF-52AD3B3E4AEA"} }, { "_class": "app.entity.Filme", "id": "E5AE7B60-2EE9-4025-9021-5755510AFE21", "titulo": "O senhor dos anéis" }, { "_class": "app.entity.AtorFilme", "id": "9522FDA2-65E2-4E41-811C-22F2CBC818D7", "ator": {"id": "66130FE8-F8DC-4887-B815-A35E42EC0BB4"}, "filme": {"id": "E5AE7B60-2EE9-4025-9021-5755510AFE21"} }, { "_class": "app.entity.SNSDGrupo", "id": "48631515-F532-4674-BF30-7C0A3D92882C", "integrante": "Kim Taeyeon", "grupo": "SNSD", "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"} }, { "_class": "app.entity.SNSDGrupo", "id": "F7F1D934-EF30-4FF2-B6EB-631A0E75DADE", "integrante": "Jessica Jung", "grupo": "SNSD", "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"} }, { "_class": "app.entity.SNSDGrupo", "id": "EAF777F3-3980-4340-A683-91875813D653", "integrante": "Tiffany Hwang Young", "grupo": "SNSD", "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"} }, { "_class": "app.entity.GrupoPessoa", "id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D", "gruponome": "SNSDMayumi" }, { "_class": "app.entity.GrupoPessoa", "id": "12033AAB-DC75-4E85-9994-80A74824FEDA", "gruponome": "TTSDeborah" }, { "_class": "app.entity.GrupoPessoa", "id": "DB1A914C-32B6-4453-B773-83764D773F5B", "gruponome": "SMTownRodrigo" }, { "_class": "app.entity.GrupoGrupoNegocio", "id": "43A654F2-3736-448D-B645-8233FE2C066B", "grupocomprador": {"id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D"}, "grupo_1vendedor": {"id": "DB1A914C-32B6-4453-B773-83764D773F5B"} }, { "_class": "app.entity.GrupoGrupoNegocio", "id": "D7AE6195-F31E-4AF2-AC10-16A798165AA1", "grupocomprador": {"id": "12033AAB-DC75-4E85-9994-80A74824FEDA"}, "grupo_1vendedor": {"id": "DB1A914C-32B6-4453-B773-83764D773F5B"} }, { "_class": "app.entity.GrupoGrupoNegocio", "id": "802254BF-F64A-4185-B05A-4373ECE31014", "grupocomprador": {"id": "12033AAB-DC75-4E85-9994-80A74824FEDA"}, "grupo_1vendedor": {"id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D"} } ] |
Nessa página
Índice