Date: Thu, 28 Mar 2024 14:23:44 +0000 (UTC) Message-ID: <1582444905.9.1711635824214@ip-172-25-76-134.ec2.internal> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_8_977387554.1711635824210" ------=_Part_8_977387554.1711635824210 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html
O arquivo populate.json (Endere=C3=A7o: src/main/=
java/app/populate.json
) possui v=C3=A1rios registros das entidades d=
a estrutura de seguran=C3=A7a do Cronapp, como User
, Sec=
urable
e Role
. Seu objetivo =C3=A9 popular o Banco=
de dados do projeto com uma base de dados m=C3=ADnima. Assim, um projeto r=
ec=C3=A9m-criado no Cronapp pode ser imediatamente executado e sua aplica=
=C3=A7=C3=A3o ser=C3=A1 funcional, um usu=C3=A1rio Administrador j=C3=A1 es=
tar=C3=A1 dispon=C3=ADvel para logar (usu=C3=A1rio e senha: "admin") nas ap=
lica=C3=A7=C3=B5es web e mobile.
N=C3=A3o =C3=A9 necess=C3=A1rio manipular esse arquivo e n=C3=A3o recome= ndamos que o fa=C3=A7a, seu conte=C3=BAdo =C3=A9 edit=C3=A1vel de forma low= -code atrav=C3=A9s da ferramenta Permiss=C3=A3o de seguran=C3=A7a. O relaci= onamento entre as classes e a estrutura de seguran=C3=A7a do Cronapp s=C3= =A3o apresentados na documenta=C3=A7=C3=A3o Permiss=C3=A3o de seguran=C3=A7a.
Essa documenta=C3=A7=C3=A3o apresenta a estrutura do arquivo popul=
ate.json
apenas para conhecimento, mas n=C3=A3o incentivamos a sua m=
anipula=C3=A7=C3=A3o. Como se trata de um conte=C3=BAdo high-code, a manipu=
la=C3=A7=C3=A3o do c=C3=B3digo =C3=A9 de responsabilidade do usu=C3=A1rio.<=
/p>
Tenha cuidado ao adicionar publica= mente seu projeto em sistemas de controle de vers=C3=B5es, como GitHub,&nbs= p;bitbucket, GitLab e outros, pois os dados informados no arqui= vo ficar=C3=A3o expostos.
O arquivo populate.json
alimenta o Banco de dados sempre que o projeto =C3=A9 executado no Cronapp=
. Se algum dado contido no arquivo for alterado no Banco de dados, como mud=
ar a senha do usu=C3=A1rio Administrador de "admin" para "novaSenha", ao pa=
rar e executar (debug) o projeto novamente, a senha retornar=C3=A1 ao valor=
padr=C3=A3o, "admin". Veja abaixo como contornar isso.
src/main/java/app/populate.json
)=
.*.war
): basta desmarcar=
a op=C3=A7=C3=A3o Auto Popular Dados
Figura 1 - Arquivo populate.json= strong>
Campo password da tabela User
O valor do campo password
da entidade User
no =
arquivo populate.json
j=C3=A1 deve estar criptografado. Caso q=
ueira alterar esse valor, sugerimos que acesse a p=C3=A1gina de usu=C3=A1ri=
os da aplica=C3=A7=C3=A3o, insira um usu=C3=A1rio e copie o hash gerado no =
campo password
na tabela User
do Banco de dados p=
ara alimentar o arquivo populate.json.
Nesse exemplo vamos mostrar como alimentar as entidades criadas no Diagrama de dados e como ocorre as inter=
a=C3=A7=C3=B5es de relacionamentos no arquivo populate.json
.=
p>
Necess=C3=A1rio:<= /span>
id=
code>, sugerimos utilizar algum site para gerar UUID para os identificadore=
s.
O primeiro exemplo a ser utilizado ser=C3=A1 da classe "Anime" que n=C3= =A3o possui relacionamentos (Figura 2). Essa classe possui quatro campos:= p>
Figura 2 - Classe sem relacionamen= to
Para inserir dados nessa classe atrav=C3=A9s=
do arquivo, voc=C3=AA precisa especificar a classe e todos os seus campos =
nos atributos do objeto JSON. Para indicar a classe, =C3=A9 necess=C3=A1rio=
informar a chave "_class
" e o seu valor=
ser=C3=A1 o "caminho" (Figura 2.2) onde encontra a classe ("<name=
space>.<pacote>.<nomedaclasse>
" - sem a extens=C3=A3o=
.java
). No exemplo da figura 2.1, ele ficar=C3=A1 do seguinte=
modo: "_class" : "app.entity.Anime
".
= strong>
Figura 2.1 - Caminho: namespace.pa= cote.classe
Os demais atributos do objeto devem ser incl=
u=C3=ADdos da mesma forma, atrav=C3=A9s do par "chave":"valor"
=
. Al=C3=A9m disso, os valores dos atributos da classe precisam estar em con=
forme com os tipos definidos, seguindo o padr=C3=A3o dos atributos JSON, ou=
seja, String possui aspas duplas, j=C3=A1 N=C3=BAmeros e Boleano n=C3=A3o =
(veja mais detalhes em JSON).
{ =09"_class" : "app.entity.Anime", =09"id": "7A0DCC99-668B-4E28-8EE0-90D607CDAB5D", =09"titulo": "Naruto", =09"episodio": 700, =09"completo": true }
Duas coisas importantes (padr=C3=A3o JSON):
Tanto no relacionamento 1-1 quanto 1-N, a ordem como s=C3=A3o apresentad=
os os objetos no arquivo populate.json
tem fundamental import=
=C3=A2ncia, o objeto que possui a chave prim=C3=A1ria do relaciona=
mento deve ser inserido primeiro e s=C3=B3 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<=
/strong>, dessa forma, no arquivo JSON, o objeto Carro pre=
cisa ser inserido primeiro que o objeto Cliente, evitando =
que seja inserido no banco uma chave estrangeira sem que exista ainda a cha=
ve prim=C3=A1ria da outra tabela.
Para saber mais sobre a tabela de relacionamentos 1-1 e 1-N no Cronapp, = consulte a p=C3=A1gina: Relacionamento entre classes no CRUD
Figura 2.2 - Relacionamento 1-1
Caso a ordem seja invertida, durante a execu= =C3=A7=C3=A3o do projeto ser=C3=A1 exibida no console uma exce=C3=A7=C3=A3o= parecida com a do bloco abaixo:
Mensagem exibida em um banco H2 ao ali= mentar os relacionamentos na ordem invertida
Internal Exception: org.h2.jdbc.JdbcSQLException: Constraint "FK_CLIENTE= _fk_carro" already exists; SQL statement: ALTER TABLE "CLIENTE" ADD CO= NSTRAINT "FK_CLIENTE_fk_carro" FOREIGN KEY (fk_carro) REFERENCES "CARRO" (i= d) [90045-197]
A inser=C3=A7=C3=A3o da chave estrangeira no objeto =C3=A9 bem simples, bas=
ta indica o nome da chave prim=C3=A1ria do outro objeto e o seu valor entre=
chaves. Na figura 2.2, a chave estrangeira recebe o nome da classe, ent=C3=
=A3o ele ficar=C3=A1 do seguinte modo:
Sintaxe:
"_class": "classe",
=
"chave prim=C3=A1ria da classe": "valor da chave prim=C3=A1ria","classe relacionada": {"chave prim=C3=A1ria da class=
e relacionada": "valor da chave prim=C3=A1ria"}
{ "_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"} }
A figura abaixo mostra como fica os objetos=
do arquivo populate com o mesmo objeto se relacionando duas vezes com outr=
a classe. Nesse caso, a classe Negocio
s=C3=B3 guarda as chave=
s estrangeiras da classe Pessoa
.
Figur= a 2.3 - Duplo relacionamento 1-N
Sintaxe:
"_class": "classe",
<=
/strong>"chave prim=C3=A1ria da classe": "valor da chave =
prim=C3=A1ria",
"classe relacionada 1": {"=
chave prim=C3=A1ria da classe relacionada 1": "valor da chave prim=C3=A1ria=
1"},
"classe relacionada 1": {"chave prim=
=C3=A1ria da classe relacionada 1": "valor da chave prim=C3=A1ria 2"}
{ "_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"} }
Da mesma forma que o relacionamento 1-1 ou 1-N, os objetos que n=C3=A3o =
possuem a chave estrangeira precisam ser adicionados primeiros para depois =
adicionar o objeto que a carrega - nesse caso, ser=C3=A1 o objeto referente=
a classe de associa=C3=A7=C3=A3o. 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
Figura 2.4 - Relacionamento N-M
A forma de inserir a chave estrangeira tamb=
=C3=A9m =C3=A9 a mesma que no relacionamento 1-1 ou 1-N, mas nesse caso as =
chaves se encontram na classe AtorFilme
- ent=C3=A3o ela ficar=
=C3=A1 do seguinte modo:
Sintaxe:
"_class": "classe associati=
va",
"chave prim=C3=A1ria da classe": "val=
or da chave prim=C3=A1ria",
"classe relaci=
onada 1": {"chave prim=C3=A1ria da classe relacionada 1": "valor da chave p=
rim=C3=A1ria 1"},
"classe relacionada 2": =
{"chave prim=C3=A1ria da classe relacionada 2": "valor da chave prim=C3=A1r=
ia 2"}
{ "_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=C3=A9is" }, { "_class": "app.entity.AtorFilme", "id": "9522FDA2-65E2-4E41-811C-22F2CBC818D7", "ator": {"id": "66130FE8-F8DC-4887-B815-A35E42EC0BB4"}, "filme": {"id": "E5AE7B60-2EE9-4025-9021-5755510AFE21"} }
Os objetos com auto relacionamentos devem s= er iniciados com um objeto que n=C3=A3o possua relacionamento ou que se rel= acione com ele mesmo, nesse caso, a inser=C3=A7=C3=A3o do atributo de c= have estrangeira precisa ser inserida por =C3=BAltimo no objeto.
Para saber mais sobre a tabela de auto relacionamento no Cronapp, consul= te a p=C3=A1gina: Relacionamento entre classes no CRUD.
Figura 2.5 - Classes com auto rela= cionamento
Sintaxe:
"_class": "classe",
<=
/strong>"chave prim=C3=A1ria da classe": "valor da chave =
prim=C3=A1ria",
"classe relacionada": {"ch=
ave prim=C3=A1ria da classe": "valor da chave prim=C3=A1ria"}
O bloco abaixo mostra como fica os objetos = do arquivo JSON para inser=C3=A7=C3=A3o de uma classe com auto relacionamen= to 1-N, os dados s=C3=A3o para o exemplo da Figura 2.5 (classe Grupo).
{ "_class": "app.entity.Grupo", "id": "48631515-F532-4674-BF30-7C0A3D92882C", "integrante": "Kim Taeyeon", =09"grupo": "SNSD", "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"} }, { "_class": "app.entity.Grupo", "id": "F7F1D934-EF30-4FF2-B6EB-631A0E75DADE", "integrante": "Jessica Jung", =09"grupo": "SNSD", "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"} }, { "_class": "app.entity.Grupo", "id": "EAF777F3-3980-4340-A683-91875813D653", "integrante": "Tiffany Young", =09"grupo": "SNSD", "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"} }
No bloco abaixo exibimos todos os objetos apresentados nesse documento. = N=C3=A3o exibimos os objetos das entidades da estrutura de seguran=C3=A7a d= o Cronapp.
[ { "_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=C3=A9is" }, { "_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", =09"grupo": "SNSD", "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"} }, { "_class": "app.entity.Grupo", "id": "F7F1D934-EF30-4FF2-B6EB-631A0E75DADE", "integrante": "Jessica Jung", =09"grupo": "SNSD", "lider": { "id": "48631515-F532-4674-BF30-7C0A3D92882C"} }, { "_class": "app.entity.Grupo", "id": "EAF777F3-3980-4340-A683-91875813D653", "integrante": "Tiffany Young", =09"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"} } ]