Versões comparadas

Chave

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

Introdução

Populate é um arquivo JSON que serve para popular automaticamente entidades JPA. Esse arquivo já é criado automaticamente nos projetos do Cronapp pois 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.

Pré-condição:

Antes de utilizar o arquivo, tenha em mente duas coisas:

  • Ter criado a camada de persistência das classes;
  • Gerar UUID para os identificadores.


Aviso
titleImportante

Trabalhar com versionamento e realizar commits tornam esses dados que estão inseridos nesses arquivos expostos para todos que tiverem acesso.


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.


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.1, ele ficará do seguinte modo: "_class" : "app.entity.Anime"


Figura 2.2 - Caminho: namespace.pacote.nomedaclasse



"
id": "7A0DCC99-668B-4E28-8EE0-90D607CDAB5D",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 do campo - como mostrado abaixo. Além disso, os valores dos campos precisam estar em conforme como o banco ler.

"titulo": "Naruto",

"episodio": 700,

"completo": true


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 a serem notadas são os colchetes e as vírgulas. O par de colchetes é usado uma única vez no arquivo, ele vai englobar todos objetos e cada objeto deve ser separado por vírgula.

Comportamento do arquivo para relacionamento 1-1 e 1-N

Tanto no relacionamento 1-1 quanto 1-N, a ordem como eles são apresentados no arquivo tem fundamental importância - pois o detalhe se encontra na chave estrangeira. O objeto que não possui a chave estrangeira deve ser inserido primeiro, para depois vim o objeto que possui a chave estrangeira. Por exemplo, na figura 2.3 a tabela cliente carrega a chave estrangeira da tabela carro, então no arquivo JSON precisa ser inserido o objeto carro para depois ser inserido o objeto cliente.


Figura 2.3 - Relacionamento 1-1


A inserção da chave estrangeira no objeto é bem simples também, basta indica o nome da chave estrangeira na classe e relacionar com o id da classe entre chaves. Na figura 2.3, a chave estrangeira recebe o nome da classe, então ele ficará do seguinte modo:

 "carro": {"id": "3AA6CAF2-ACB3-4A45-9C53-03FD2FE7A393"}

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

Então, para cada par de objetos, primeiro precisa ser adicionado o objeto que não carrega a chave estrangeira para depois adicionar o objeto que a carrega.

Comportamento do arquivo para 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.


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": "app.entity.AtorFilme",
"id": "9522FDA2-65E2-4E41-811C-22F2CBC818D7",
"ator": {"id": "66130FE8-F8DC-4887-B815-A35E42EC0BB4"},
"filme": {"id": "1C17F46F-F176-4E90-BABF-52AD3B3E4AEA"}


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

Exemplos usando 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.

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 SNSD).


Bloco de código
languagejs
themeConfluence
titleAutorrelacionamento 1-N
{
    "_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.SNSD",
    "id": "EAF777F3-3980-4340-A683-91875813D653",
    "integrante": "Tiffany Hwang",
    "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 grupo).

Bloco de código
languagejs
themeConfluence
titleAutorrelacionamento N-M
{
    "_class": "app.entity.Grupo",
    "id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D",
    "grupo": "SNSD"
  },
  {
    "_class": "app.entity.Grupo",
    "id": "12033AAB-DC75-4E85-9994-80A74824FEDA",
    "grupo": "TTS"
  },
  {
    "_class": "app.entity.Grupo",
    "id": "DB1A914C-32B6-4453-B773-83764D773F5B",
    "grupo": "SMTown"
  },
   {
    "_class": "app.entity.GrupoGrupo",
    "id": "43A654F2-3736-448D-B645-8233FE2C066B",
    "grupo": {"id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D"},
    "grupo_1": {"id": "DB1A914C-32B6-4453-B773-83764D773F5B"}
  },
  {
    "_class": "app.entity.GrupoGrupo",
    "id": "D7AE6195-F31E-4AF2-AC10-16A798165AA1",
    "grupo": {"id": "12033AAB-DC75-4E85-9994-80A74824FEDA"},
    "grupo_1": {"id": "DB1A914C-32B6-4453-B773-83764D773F5B"}
  },
  {
    "_class": "app.entity.GrupoGrupo",
    "id": "802254BF-F64A-4185-B05A-4373ECE31014",
    "grupo": {"id": "12033AAB-DC75-4E85-9994-80A74824FEDA"},
    "grupo_1": {"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
[
    {
    "_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.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.SNSD",
    "id": "EAF777F3-3980-4340-A683-91875813D653",
    "integrante": "Tiffany Hwang",
    "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"}
  },
  {
    "_class": "app.entity.Grupo",
    "id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D",
    "grupo": "SNSD"
  },
  {
    "_class": "app.entity.Grupo",
    "id": "12033AAB-DC75-4E85-9994-80A74824FEDA",
    "grupo": "TTS"
  },
  {
    "_class": "app.entity.Grupo",
    "id": "DB1A914C-32B6-4453-B773-83764D773F5B",
    "grupo": "SMTown"
  },
   {
    "_class": "app.entity.GrupoGrupo",
    "id": "43A654F2-3736-448D-B645-8233FE2C066B",
    "grupo": {"id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D"},
    "grupo_1": {"id": "DB1A914C-32B6-4453-B773-83764D773F5B"}
  },
  {
    "_class": "app.entity.GrupoGrupo",
    "id": "D7AE6195-F31E-4AF2-AC10-16A798165AA1",
    "grupo": {"id": "12033AAB-DC75-4E85-9994-80A74824FEDA"},
    "grupo_1": {"id": "DB1A914C-32B6-4453-B773-83764D773F5B"}
  },
  {
    "_class": "app.entity.GrupoGrupo",
    "id": "802254BF-F64A-4185-B05A-4373ECE31014",
    "grupo": {"id": "12033AAB-DC75-4E85-9994-80A74824FEDA"},
    "grupo_1": {"id": "67C9F4D1-2231-4904-94DD-CDE0E888A17D"}
  }
]


Nessa página

Índice