Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

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 à 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
titleImportante

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 expostas.


Figura 1 - Arquivo populate.json


Nota
titleCampo password da tabela User

Caso queira utilizar o populate para a tabela User, saiba que o campo password é criptografado (é gerado um hash para a senha) pelo Cronapp. Dessa forma, sugerimos que acesse o formulário de CRUD User, insira usuários e copie o hash gerado no campo password na tabela User do banco de dados para alimentar o arquivo populate.json, caso contrário não conseguirá logar com o usuário cadastrado a partir do 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.


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".


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
languagejs
themeConfluence
titleResultado final para a estrutura básica
{
	"_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.

Para saber mais sobre a tabela de autorrelacionamento no Cronapp, consulte a página: Relacionamento entre classes no CRUD


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:

Aviso
titleMensagem exibida a partir de em um banco H2 ao alimentar os relacionamentos na ordem invertida

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.3, a chave estrangeira recebe o nome da classe, então ele ficará do seguinte modo: 

"classe relacionada": {"chave primária da classe relacionada": "valor da chave primária"}


Bloco de código
languagejs
themeConfluence
titleResultado final do relacionamento 1-1
{
    "_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.


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:

"_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
languagejs
themeConfluence
titleResultado final para relacionamento n-m
{
    "_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"}
  }

Autorrelacionamento

Da mesma forma que os relacionamento 1-1, 1-N e 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.

Para saber mais sobre a tabela de autorrelacionamento no Cronapp, consulte a página: Relacionamento entre classes no CRUD


Figura 2.5 - Classes com autorrelacionamento


O bloco abaixo mostra como fica os objetos do arquivo JSON para inserção de uma classe com autorrelacionamento 1-N, os dados são para o exemplo da Figura 2.5 (classe Grupo).


Bloco de código
languagejs
themeConfluence
titleAutorrelacionamento 1-N
  {
    "_class": "app.entity.Grupo",
    "id": "48631515-F532-4674-BF30-7C0A3D92882C",
    "integrante": "Kim Taeyeon",
	"grupo": "SNSD",
    "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"}
  },
  {
    "_class": "app.entity.Grupo",
    "id": "F7F1D934-EF30-4FF2-B6EB-631A0E75DADE",
    "integrante": "Jessica Jung",
	"grupo": "SNSD",
    "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"}
  },
  {
    "_class": "app.entity.Grupo",
    "id": "EAF777F3-3980-4340-A683-91875813D653",
    "integrante": "Tiffany Young",
	"grupo": "SNSD",
    "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"}
  }


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 Pessoa). A classe negocio só guarda as chaves estrangeiras da classe pessoa.

Bloco de código
languagejs
themeConfluence
titleAutorrelacionamento N-M
{
    "_class": "app.entity.Pessoa",
    "id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D",
    "nome": "Mayumi"
  },
  {
    "_class": "app.entity.Pessoa",
    "id": "12033AAB-DC75-4E85-9994-80A74824FEDA",
    "nome": "Deborah"
  },
  {
    "_class": "app.entity.Pessoa",
    "id": "DB1A914C-32B6-4453-B773-83764D773F5B",
    "nome": "Rodrigo"
  },
   {
    "_class": "app.entity.Negocio",
    "id": "43A654F2-3736-448D-B645-8233FE2C066B",
    "comprador": {"id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D"},
    "vendedor": {"id": "DB1A914C-32B6-4453-B773-83764D773F5B"}
  },
  {
    "_class": "app.entity.Negocio",
    "id": "D7AE6195-F31E-4AF2-AC10-16A798165AA1",
    "comprador": {"id": "12033AAB-DC75-4E85-9994-80A74824FEDA"},
    "vendedor": {"id": "DB1A914C-32B6-4453-B773-83764D773F5B"}
  },
  {
    "_class": "app.entity.Negocio",
    "id": "802254BF-F64A-4185-B05A-4373ECE31014",
    "comprador": {"id": "12033AAB-DC75-4E85-9994-80A74824FEDA"},
    "vendedor": {"id": "67C9F4D1-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
languagejs
themeConfluence
titlePopulate.JSON
linenumberstrue
collapsetrue
[
    {
    "_class": "app.entity.User",
    "id": "304BF43E-0E62-4F4A-8A63-3F22D7AD4611",
    "name": "admin",
    "login": "admin",
    "password": "$2a$10$LjzpM1Q3VoAtG2dTCCabNuW0/amVPjL3Iyvyi2Dj7NP.HngtzSewu"
  },
  {
    "_class": "app.entity.Role",
    "id": "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.Grupo",
    "id": "48631515-F532-4674-BF30-7C0A3D92882C",
    "integrante": "Kim Taeyeon",
	"grupo": "SNSD",
    "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"}
  },
  {
    "_class": "app.entity.Grupo",
    "id": "F7F1D934-EF30-4FF2-B6EB-631A0E75DADE",
    "integrante": "Jessica Jung",
	"grupo": "SNSD",
    "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"}
  },
  {
    "_class": "app.entity.Grupo",
    "id": "EAF777F3-3980-4340-A683-91875813D653",
    "integrante": "Tiffany Young",
	"grupo": "SNSD",
    "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"}
  },
  {
    "_class": "app.entity.Pessoa",
    "id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D",
    "nome": "Mayumi"
  },
  {
    "_class": "app.entity.Pessoa",
    "id": "12033AAB-DC75-4E85-9994-80A74824FEDA",
    "nome": "Deborah"
  },
  {
    "_class": "app.entity.Pessoa",
    "id": "DB1A914C-32B6-4453-B773-83764D773F5B",
    "nome": "Rodrigo"
  },
   {
    "_class": "app.entity.Negocio",
    "id": "43A654F2-3736-448D-B645-8233FE2C066B",
    "comprador": {"id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D"},
    "vendedor": {"id": "DB1A914C-32B6-4453-B773-83764D773F5B"}
  },
  {
    "_class": "app.entity.Negocio",
    "id": "D7AE6195-F31E-4AF2-AC10-16A798165AA1",
    "comprador": {"id": "12033AAB-DC75-4E85-9994-80A74824FEDA"},
    "vendedor": {"id": "DB1A914C-32B6-4453-B773-83764D773F5B"}
  },
  {
    "_class": "app.entity.Negocio",
    "id": "802254BF-F64A-4185-B05A-4373ECE31014",
    "comprador": {"id": "12033AAB-DC75-4E85-9994-80A74824FEDA"},
    "vendedor": {"id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D"}
  }
]


Nessa página

Índice