• Nenhum resultado encontrado

Valida¸c˜ao ´agil e precisa de projetos conceituais de banco de dados Apˆendice: Mapeamentos

N/A
N/A
Protected

Academic year: 2022

Share "Valida¸c˜ao ´agil e precisa de projetos conceituais de banco de dados Apˆendice: Mapeamentos"

Copied!
72
0
0

Texto

(1)

projetos conceituais de banco de dados

Apˆ endice: Mapeamentos

Marcos Eduardo Bolelli Broinizi

(2)
(3)

1 Mapeamentos 1

1.1 Abstra¸c˜ao de Classifica¸c˜ao . . . 1

1.1.1 SQL Gerado . . . 3

1.2 Abstra¸c˜ao de Generaliza¸c˜ao-especializa¸c˜ao . . . 4

1.2.1 Generaliza¸c˜ao - Total Disjunta . . . 4

1.2.2 Generaliza¸c˜ao - Total Sobrepon´ıvel . . . 9

1.2.3 Generaliza¸c˜ao - Parcial Disjunta . . . 14

1.2.4 Generaliza¸c˜ao - Parcial Sobrepon´ıvel . . . 18

1.2.5 Generaliza¸c˜ao - Parcial Sobrepon´ıvel : Especializa¸c˜ao definida por Predicado . . . 23

1.3 Abstra¸c˜ao de Relacionamento . . . 29

1.3.1 Cardinalidade - Um para Um . . . 29

1.3.2 Cardinalidade - Um para Ene . . . 32

1.3.3 Cardinalidade - Ene para Um . . . 35

1.3.4 Cardinalidade - Ene para Ene . . . 38

1.4 Abstra¸c˜ao de Composi¸c˜ao . . . 41

1.4.1 Composi¸c˜ao - L´ogica : Cardinalidade - Um para Um . . . 41

1.4.2 Composi¸c˜ao - L´ogica : Cardinalidade - Um para Ene . . . 44

1.4.3 Composi¸c˜ao - F´ısica : Cardinalidade - Um para Um . . . 47

1.4.4 Composi¸c˜ao - F´ısica : Cardinalidade - Um para Ene . . . 50

1.5 Abstra¸c˜ao de Objeto-relacionamento . . . 53

1.5.1 Cardinalidade - Um para Um . . . 53

1.5.2 Cardinalidade - Um para Ene . . . 59

1.5.3 Cardinalidade - Ene para Um . . . 65

1.5.4 Cardinalidade - Ene para Ene . . . 65

iii

(4)

Mapeamentos

Este texto apresenta os poss´ıveis mapeamentos de cada uma das abstra¸c˜oes representadas na ferramenta, considerando as diversas varia¸c˜oes de parˆametros.

1.1 Abstra¸ c˜ ao de Classifica¸ c˜ ao

@Entity

public class Pessoa extends AbstractNakedObject {

private final TextString nome = new TextString();

public TextString getNome() {

return nome;

}

public Title title() {

return getNome().title();

}

1

(5)

} ...

@Entity

public class Aplicacao extends AbstractNakedObject {

private final Date data = new Date();

private final Money saldo = new Money();

private final MultilineTextString info = new MultilineTextString();

private final TextString nome = new TextString();

private final WholeNumber numero = new WholeNumber();

public Title title() {

return getNome().title();

}

public Date getData() {

return data;

}

public Money getSaldo() {

return saldo;

}

public MultilineTextString getInfo() {

return info;

}

(6)

public TextString getNome() {

return nome;

}

public WholeNumber getNumero() {

return numero;

} }

1.1.1 SQL Gerado

CREATE TABLE APLICACAO (

info VARCHAR(256), nome VARCHAR(256), numero INTEGER,

saldo NUMERIC(15, 3), data DATE,

id_aplicacao NUMERIC(10) NOT NULL ,

CONSTRAINT PK_APLICACAO PRIMARY KEY (id_aplicacao) );

CREATE TABLE PESSOA (

nome VARCHAR(256),

id_pessoa NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PESSOA PRIMARY KEY (id_pessoa) );

(7)

1.2 Abstra¸ c˜ ao de Generaliza¸ c˜ ao-especializa¸ c˜ ao

1.2.1 Generaliza¸c˜ao - Total Disjunta

@Generalization(

completeness = Generalization.Completeness.Total, disjointness = Generalization.Disjointness.Disjoint )

public class Pessoa extends AbstractNakedObject {

private final TextString nome = new TextString();

public TextString getNome() {

return nome;

}

public Title title() {

return getNome().title();

} } ...

@Specialization(

specializes = Pessoa.class )

@Entity

public class Funcionario extends AbstractNakedObject {

private final TextString idFuncional = new TextString();

(8)

public Title title() {

NakedObject parent = (NakedObject) AutoGeneratedCaller.call(this,"getIs",null);

if(parent != null) {

return parent.title().append(" - ",this.getIdFuncional());

} else {

return this.getIdFuncional().title();

} }

public TextString getIdFuncional() {

return this.idFuncional;

} } ...

@Specialization(

specializes = Pessoa.class )

@Entity

public class Aluno extends AbstractNakedObject {

private final TextString idAluno = new TextString();

public Title title() {

NakedObject parent = (NakedObject) AutoGeneratedCaller.call(this,"getIs",null);

if(parent != null)

(9)

{

return parent.title().append(" - ",this.getIdAluno());

} else {

return this.getIdAluno().title();

} }

public TextString getIdAluno() {

return this.idAluno;

} }

SQL Gerado

CREATE TABLE PESSOA_SPEC_DESC (

description DATE,

id_pessoa_spec_desc NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PESSOA_SPEC_DESC PRIMARY KEY (id_pessoa_spec_desc) );

CREATE TABLE PESSOA_SPEC (

fk_pessoa_spec NUMERIC(10) NOT NULL UNIQUE , fk_pessoa NUMERIC(10) NOT NULL ,

date_end DATE, date_begin DATE,

CONSTRAINT PK_PESSOA_SPEC PRIMARY KEY (fk_pessoa)

(10)

);

CREATE TABLE PESSOA (

nome VARCHAR(256),

id_pessoa NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PESSOA PRIMARY KEY (id_pessoa) );

CREATE TABLE FUNCIONARIO (

id_funcionario NUMERIC(10) NOT NULL , idfuncional VARCHAR(256),

CONSTRAINT PK_FUNCIONARIO PRIMARY KEY (id_funcionario) );

CREATE TABLE ALUNO (

id_aluno NUMERIC(10) NOT NULL , idaluno VARCHAR(256),

CONSTRAINT PK_ALUNO PRIMARY KEY (id_aluno) );

ALTER TABLE FUNCIONARIO

ADD CONSTRAINT FUNCIONARIO_PESSOA FOREIGN KEY (id_funcionario) REFERENCES PESSOA (id_pessoa)

ON DELETE CASCADE

;

ALTER TABLE ALUNO

ADD CONSTRAINT ALUNO_PESSOA FOREIGN KEY (id_aluno)

(11)

REFERENCES PESSOA (id_pessoa) ON DELETE CASCADE

;

ALTER TABLE PESSOA_SPEC

ADD CONSTRAINT PESSOA_SPEC_PESSOA_SPEC_DESC FOREIGN KEY (fk_pessoa_spec) REFERENCES PESSOA_SPEC_DESC (id_pessoa_spec_desc)

ON DELETE CASCADE

;

ALTER TABLE PESSOA_SPEC

ADD CONSTRAINT PESSOA_SPEC_PESSOA FOREIGN KEY (fk_pessoa) REFERENCES PESSOA (id_pessoa)

ON DELETE CASCADE

;

CREATE ASSERTION ASS_PESSOA_SPEC CHECK ( EXISTS ( SELECT id_pessoa

FROM PESSOA WHERE

id_pessoa IN ( SELECT fk_pessoa FROM PESSOA_SPEC )

) )

;

INSERT INTO PESSOA_SPEC_DESC (id_pessoa_spec_desc, description ) VALUES (0,’FUNCIONARIO’);

INSERT INTO PESSOA_SPEC_DESC (id_pessoa_spec_desc, description )

(12)

VALUES (1,’ALUNO’);

1.2.2 Generaliza¸c˜ao - Total Sobrepon´ıvel

@Generalization(

completeness = Generalization.Completeness.Total, disjointness = Generalization.Disjointness.Overlapping )

public class Pessoa extends AbstractNakedObject {

private final TextString nome = new TextString();

public TextString getNome() {

return nome;

}

public Title title() {

return getNome().title();

} } ...

@Specialization(

specializes = Pessoa.class )

@Entity

public class Funcionario extends AbstractNakedObject {

private final TextString idFuncional = new TextString();

(13)

public Title title() {

NakedObject parent = (NakedObject) AutoGeneratedCaller.call(this,"getIs",null);

if(parent != null) {

return parent.title().append(" - ",this.getIdFuncional());

} else {

return this.getIdFuncional().title();

} }

public TextString getIdFuncional() {

return this.idFuncional;

} } ...

@Specialization(

specializes = Pessoa.class )

@Entity

public class Aluno extends AbstractNakedObject {

private final TextString idAluno = new TextString();

public Title title() {

NakedObject parent = (NakedObject) AutoGeneratedCaller.call(this,"getIs",null);

if(parent != null)

(14)

{

return parent.title().append(" - ",this.getIdAluno());

} else {

return this.getIdAluno().title();

} }

public TextString getIdAluno() {

return this.idAluno;

} }

SQL Gerado

CREATE TABLE FUNCIONARIO (

id_funcionario NUMERIC(10) NOT NULL , idfuncional VARCHAR(256),

CONSTRAINT PK_FUNCIONARIO PRIMARY KEY (id_funcionario) );

CREATE TABLE PESSOA_SPEC (

fk_pessoa_spec NUMERIC(10) NOT NULL , fk_pessoa NUMERIC(10) NOT NULL , date_end DATE,

date_begin DATE,

CONSTRAINT PK_PESSOA_SPEC PRIMARY KEY (fk_pessoa, fk_pessoa_spec)

(15)

);

CREATE TABLE ALUNO (

id_aluno NUMERIC(10) NOT NULL , idaluno VARCHAR(256),

CONSTRAINT PK_ALUNO PRIMARY KEY (id_aluno) );

CREATE TABLE PESSOA_SPEC_DESC (

description DATE,

id_pessoa_spec_desc NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PESSOA_SPEC_DESC PRIMARY KEY (id_pessoa_spec_desc) );

CREATE TABLE PESSOA (

nome VARCHAR(256),

id_pessoa NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PESSOA PRIMARY KEY (id_pessoa) );

ALTER TABLE FUNCIONARIO

ADD CONSTRAINT FUNCIONARIO_PESSOA FOREIGN KEY (id_funcionario) REFERENCES PESSOA (id_pessoa)

ON DELETE CASCADE

;

ALTER TABLE ALUNO

ADD CONSTRAINT ALUNO_PESSOA FOREIGN KEY (id_aluno)

(16)

REFERENCES PESSOA (id_pessoa) ON DELETE CASCADE

;

ALTER TABLE PESSOA_SPEC

ADD CONSTRAINT PESSOA_SPEC_PESSOA FOREIGN KEY (fk_pessoa) REFERENCES PESSOA (id_pessoa)

ON DELETE CASCADE

;

ALTER TABLE PESSOA_SPEC

ADD CONSTRAINT PESSOA_SPEC_PESSOA_SPEC_DESC FOREIGN KEY (fk_pessoa_spec) REFERENCES PESSOA_SPEC_DESC (id_pessoa_spec_desc)

ON DELETE CASCADE

;

CREATE ASSERTION ASS_PESSOA_SPEC CHECK ( EXISTS ( SELECT id_pessoa

FROM PESSOA WHERE

id_pessoa IN ( SELECT fk_pessoa FROM PESSOA_SPEC )

) )

;

INSERT INTO PESSOA_SPEC_DESC (id_pessoa_spec_desc, description ) VALUES (0,’FUNCIONARIO’);

INSERT INTO PESSOA_SPEC_DESC (id_pessoa_spec_desc, description )

(17)

VALUES (1,’ALUNO’);

1.2.3 Generaliza¸c˜ao - Parcial Disjunta

@Generalization(

completeness = Generalization.Completeness.Partial, disjointness = Generalization.Disjointness.Disjoint )

public class Pessoa extends AbstractNakedObject {

private final TextString nome = new TextString();

public TextString getNome() {

return nome;

}

public Title title() {

return getNome().title();

} } ...

@Specialization(

specializes = Pessoa.class )

@Entity

public class Funcionario extends AbstractNakedObject {

private final TextString idFuncional = new TextString();

(18)

public Title title() {

NakedObject parent = (NakedObject) AutoGeneratedCaller.call(this,"getIs",null);

if(parent != null) {

return parent.title().append(" - ",this.getIdFuncional());

} else {

return this.getIdFuncional().title();

} }

public TextString getIdFuncional() {

return this.idFuncional;

} } ...

@Specialization(

specializes = Pessoa.class )

@Entity

public class Aluno extends AbstractNakedObject {

private final TextString idAluno = new TextString();

public Title title() {

NakedObject parent = (NakedObject) AutoGeneratedCaller.call(this,"getIs",null);

if(parent != null)

(19)

{

return parent.title().append(" - ",this.getIdAluno());

} else {

return this.getIdAluno().title();

} }

public TextString getIdAluno() {

return this.idAluno;

} }

SQL Gerado

CREATE TABLE PESSOA_SPEC_DESC (

description DATE,

id_pessoa_spec_desc NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PESSOA_SPEC_DESC PRIMARY KEY (id_pessoa_spec_desc) );

CREATE TABLE PESSOA_SPEC (

fk_pessoa_spec NUMERIC(10) NOT NULL UNIQUE , fk_pessoa NUMERIC(10) NOT NULL ,

date_end DATE, date_begin DATE,

CONSTRAINT PK_PESSOA_SPEC PRIMARY KEY (fk_pessoa)

(20)

);

CREATE TABLE PESSOA (

nome VARCHAR(256),

id_pessoa NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PESSOA PRIMARY KEY (id_pessoa) );

CREATE TABLE ALUNO (

id_aluno NUMERIC(10) NOT NULL , idaluno VARCHAR(256),

CONSTRAINT PK_ALUNO PRIMARY KEY (id_aluno) );

CREATE TABLE FUNCIONARIO (

id_funcionario NUMERIC(10) NOT NULL , idfuncional VARCHAR(256),

CONSTRAINT PK_FUNCIONARIO PRIMARY KEY (id_funcionario) );

ALTER TABLE FUNCIONARIO

ADD CONSTRAINT FUNCIONARIO_PESSOA FOREIGN KEY (id_funcionario) REFERENCES PESSOA (id_pessoa)

ON DELETE CASCADE

;

ALTER TABLE ALUNO

ADD CONSTRAINT ALUNO_PESSOA FOREIGN KEY (id_aluno)

(21)

REFERENCES PESSOA (id_pessoa) ON DELETE CASCADE

;

ALTER TABLE PESSOA_SPEC

ADD CONSTRAINT PESSOA_SPEC_PESSOA FOREIGN KEY (fk_pessoa) REFERENCES PESSOA (id_pessoa)

ON DELETE CASCADE

;

ALTER TABLE PESSOA_SPEC

ADD CONSTRAINT PESSOA_SPEC_PESSOA_SPEC_DESC FOREIGN KEY (fk_pessoa_spec) REFERENCES PESSOA_SPEC_DESC (id_pessoa_spec_desc)

ON DELETE CASCADE

;

INSERT INTO PESSOA_SPEC_DESC (id_pessoa_spec_desc, description ) VALUES (0,’FUNCIONARIO’);

INSERT INTO PESSOA_SPEC_DESC (id_pessoa_spec_desc, description ) VALUES (1,’ALUNO’);

1.2.4 Generaliza¸c˜ao - Parcial Sobrepon´ıvel

@Generalization(

completeness = Generalization.Completeness.Partial, disjointness = Generalization.Disjointness.Overlapping )

public class Pessoa extends AbstractNakedObject {

private final TextString nome = new TextString();

(22)

public TextString getNome() {

return nome;

}

public Title title() {

return getNome().title();

} } ...

@Specialization(

specializes = Pessoa.class )

@Entity

public class Funcionario extends AbstractNakedObject {

private final TextString idFuncional = new TextString();

public Title title() {

NakedObject parent = (NakedObject) AutoGeneratedCaller.call(this,"getIs",null);

if(parent != null) {

return parent.title().append(" - ",this.getIdFuncional());

} else {

return this.getIdFuncional().title();

} }

(23)

public TextString getIdFuncional() {

return this.idFuncional;

} } ...

@Specialization(

specializes = Pessoa.class )

@Entity

public class Aluno extends AbstractNakedObject {

private final TextString idAluno = new TextString();

public Title title() {

NakedObject parent = (NakedObject) AutoGeneratedCaller.call(this,"getIs",null);

if(parent != null) {

return parent.title().append(" - ",this.getIdAluno());

} else {

return this.getIdAluno().title();

} }

public TextString getIdAluno() {

return this.idAluno;

(24)

} }

SQL Gerado

CREATE TABLE ALUNO (

id_aluno NUMERIC(10) NOT NULL , idaluno VARCHAR(256),

CONSTRAINT PK_ALUNO PRIMARY KEY (id_aluno) );

CREATE TABLE PESSOA_SPEC (

fk_pessoa_spec NUMERIC(10) NOT NULL , fk_pessoa NUMERIC(10) NOT NULL , date_end DATE,

date_begin DATE,

CONSTRAINT PK_PESSOA_SPEC PRIMARY KEY (fk_pessoa, fk_pessoa_spec) );

CREATE TABLE FUNCIONARIO (

id_funcionario NUMERIC(10) NOT NULL , idfuncional VARCHAR(256),

CONSTRAINT PK_FUNCIONARIO PRIMARY KEY (id_funcionario) );

CREATE TABLE PESSOA (

nome VARCHAR(256),

(25)

id_pessoa NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PESSOA PRIMARY KEY (id_pessoa) );

CREATE TABLE PESSOA_SPEC_DESC (

description DATE,

id_pessoa_spec_desc NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PESSOA_SPEC_DESC PRIMARY KEY (id_pessoa_spec_desc) );

ALTER TABLE PESSOA_SPEC

ADD CONSTRAINT PESSOA_SPEC_PESSOA_SPEC_DESC FOREIGN KEY (fk_pessoa_spec) REFERENCES PESSOA_SPEC_DESC (id_pessoa_spec_desc)

ON DELETE CASCADE

;

ALTER TABLE FUNCIONARIO

ADD CONSTRAINT FUNCIONARIO_PESSOA FOREIGN KEY (id_funcionario) REFERENCES PESSOA (id_pessoa)

ON DELETE CASCADE

;

ALTER TABLE ALUNO

ADD CONSTRAINT ALUNO_PESSOA FOREIGN KEY (id_aluno) REFERENCES PESSOA (id_pessoa)

ON DELETE CASCADE

;

ALTER TABLE PESSOA_SPEC

ADD CONSTRAINT PESSOA_SPEC_PESSOA FOREIGN KEY (fk_pessoa)

(26)

REFERENCES PESSOA (id_pessoa) ON DELETE CASCADE

;

INSERT INTO PESSOA_SPEC_DESC (id_pessoa_spec_desc, description ) VALUES (0,’FUNCIONARIO’);

INSERT INTO PESSOA_SPEC_DESC (id_pessoa_spec_desc, description ) VALUES (1,’ALUNO’);

1.2.5 Generaliza¸c˜ao - Parcial Sobrepon´ıvel : Especializa¸c˜ao definida por Predicado

@Specialization(

specializes = Person.class )

@Entity

public class Student extends AbstractNakedObject {

private final TextString id = new TextString();

public Title title() {

NakedObject parent = (NakedObject) AutoGeneratedCaller.call(this,"getIs",null);

if(parent != null) {

return parent.title().append(" - ",this.getId());

} else {

return this.getId().title();

} }

(27)

public TextString getId() {

return this.id;

} } ...

@PredicatedSpecialization(

specializes = Person.class, fieldName = "age",

operator = Operator.greaterThanEqualTo, value = "18"

)

@Entity

public class Employee extends AbstractNakedObject {

private final TextString number = new TextString();

public Title title() {

NakedObject parent = (NakedObject) AutoGeneratedCaller.call(this,"getIs",null);

if(parent != null) {

return parent.title().append(" - ",this.getNumber());

} else {

return this.getNumber().title();

} }

(28)

public TextString getNumber() {

return this.number;

} } ...

@Generalization(

completeness = Generalization.Completeness.Partial, disjointness = Generalization.Disjointness.Overlapping )

public class Person extends AbstractNakedObject {

private final TextString name = new TextString();

private final WholeNumber age = new WholeNumber();

public static String pluralName() {

return "People";

}

public WholeNumber getAge() {

return age;

}

public TextString getName() {

return name;

}

public Title title()

(29)

{

return getName().title();

} }

SQL Gerado

CREATE TABLE STUDENT (

id_student NUMERIC(10) NOT NULL , id VARCHAR(256),

CONSTRAINT PK_STUDENT PRIMARY KEY (id_student) );

CREATE TABLE EMPLOYEE (

number VARCHAR(256),

id_employee NUMERIC(10) NOT NULL ,

CONSTRAINT PK_EMPLOYEE PRIMARY KEY (id_employee) );

CREATE TABLE PERSON_SPEC (

fk_person NUMERIC(10) NOT NULL , fk_person_spec NUMERIC(10) NOT NULL , date_end DATE,

date_begin DATE,

CONSTRAINT PK_PERSON_SPEC PRIMARY KEY (fk_person, fk_person_spec) );

CREATE TABLE PERSON

(30)

(

age INTEGER,

name VARCHAR(256),

id_person NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PERSON PRIMARY KEY (id_person) );

CREATE TABLE PERSON_SPEC_DESC (

description DATE,

id_person_spec_desc NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PERSON_SPEC_DESC PRIMARY KEY (id_person_spec_desc) );

ALTER TABLE EMPLOYEE

ADD CONSTRAINT EMPLOYEE_PERSON FOREIGN KEY (id_employee) REFERENCES PERSON (id_person)

ON DELETE CASCADE

;

ALTER TABLE PERSON_SPEC

ADD CONSTRAINT PERSON_SPEC_PERSON FOREIGN KEY (fk_person) REFERENCES PERSON (id_person)

ON DELETE CASCADE

;

ALTER TABLE EMPLOYEE

ADD CHECK (id_employee IN ( SELECT id_person

FROM PERSON WHERE age >= 18

(31)

) )

;

ALTER TABLE PERSON_SPEC

ADD CONSTRAINT PERSON_SPEC_PERSON_SPEC_DESC FOREIGN KEY (fk_person_spec) REFERENCES PERSON_SPEC_DESC (id_person_spec_desc)

ON DELETE CASCADE

;

ALTER TABLE STUDENT

ADD CONSTRAINT STUDENT_PERSON FOREIGN KEY (id_student) REFERENCES PERSON (id_person)

ON DELETE CASCADE

;

INSERT INTO PERSON_SPEC_DESC (id_person_spec_desc, description ) VALUES (0,’STUDENT’);

INSERT INTO PERSON_SPEC_DESC (id_person_spec_desc, description ) VALUES (1,’EMPLOYEE’);

(32)

1.3 Abstra¸ c˜ ao de Relacionamento

1.3.1 Cardinalidade - Um para Um

@Entity

public class FichaInscricao extends AbstractNakedObject {

private final TextString id = new TextString();

private Pessoa pessoa;

public TextString getId() {

return id;

}

public Title title() {

return getId().title();

}

public Pessoa getPessoa() {

resolve(pessoa);

return pessoa;

}

public void setPessoa(Pessoa pessoa) {

this.pessoa = pessoa;

objectChanged();

}

(33)

} ...

@Entity

public class Pessoa extends AbstractNakedObject {

private final TextString nome = new TextString();

@RelationshipAssociation(

cardinality = Cardinality.OneToOne, relatedWith = FichaInscricao.class, fieldRelatedName = "pessoa",

) private FichaInscricao fichaInscricao;

public TextString getNome() {

return nome;

}

public Title title() {

return getNome().title();

}

public FichaInscricao getFichaInscricao() {

resolve(fichaInscricao);

return fichaInscricao;

}

public void setFichaInscricao(FichaInscricao fichaInscricao) {

(34)

this.fichaInscricao = fichaInscricao;

objectChanged();

} }

SQL Gerado

CREATE TABLE FICHAINSCRICAO (

id_fichainscricao NUMERIC(10) NOT NULL , fk_pessoa NUMERIC(10) NOT NULL UNIQUE , id VARCHAR(256),

CONSTRAINT PK_FICHAINSCRICAO PRIMARY KEY (id_fichainscricao) );

CREATE TABLE PESSOA (

nome VARCHAR(256),

id_pessoa NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PESSOA PRIMARY KEY (id_pessoa) );

ALTER TABLE FICHAINSCRICAO

ADD CONSTRAINT FICHAINSCRICAO_PESSOA FOREIGN KEY (fk_pessoa) REFERENCES PESSOA (id_pessoa)

ON DELETE SET NULL

;

(35)

1.3.2 Cardinalidade - Um para Ene

@Entity

public class Conta extends AbstractNakedObject {

private final TextString numero = new TextString();

private final TextString tipo = new TextString();

private Pessoa pessoa;

public TextString getNumero() {

return numero;

}

public TextString getTipo() {

return tipo;

}

public Title title() {

return getNumero().title().append("-", tipo);

}

public Pessoa getPessoa() {

resolve(this.pessoa);

return this.pessoa;

}

public void setPessoa(Pessoa pessoa)

(36)

{

this.pessoa = pessoa;

this.objectChanged();

} } ...

@Entity

public class Pessoa extends AbstractNakedObject {

private final TextString nome = new TextString();

@RelationshipAssociation(

cardinality = Cardinality.OneToMany, relatedWith = Conta.class,

fieldRelatedName = "pessoa",

) private final ExtendedInternalCollection contas =

new ExtendedInternalCollection("Contas",Conta.class, this);

public TextString getNome() {

return nome;

}

public Title title() {

return getNome().title();

}

public ExtendedInternalCollection getContas() {

return this.contas;

(37)

} }

SQL Gerado

CREATE TABLE CONTA (

numero VARCHAR(256),

fk_pessoa NUMERIC(10) NOT NULL , id_conta NUMERIC(10) NOT NULL , tipo VARCHAR(256),

CONSTRAINT PK_CONTA PRIMARY KEY (id_conta) );

CREATE TABLE PESSOA (

nome VARCHAR(256),

id_pessoa NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PESSOA PRIMARY KEY (id_pessoa) );

ALTER TABLE CONTA

ADD CONSTRAINT CONTA_PESSOA FOREIGN KEY (fk_pessoa) REFERENCES PESSOA (id_pessoa)

ON DELETE SET NULL

;

(38)

1.3.3 Cardinalidade - Ene para Um

@Entity

public class Conta extends AbstractNakedObject {

private final TextString numero = new TextString();

private final TextString tipo = new TextString();

@RelationshipAssociation(

cardinality = Cardinality.ManyToOne, relatedWith = Pessoa.class,

fieldRelatedName = "contas", )private Pessoa pessoa;

public TextString getNumero() {

return numero;

}

public TextString getTipo() {

return tipo;

}

public Title title() {

return getNumero().title().append("-", tipo);

}

public Pessoa getPessoa() {

resolve(this.pessoa);

return this.pessoa;

(39)

}

public void setPessoa(Pessoa pessoa) {

this.pessoa = pessoa;

this.objectChanged();

} } ...

@Entity

public class Pessoa extends AbstractNakedObject {

private final TextString nome = new TextString();

private final ExtendedInternalCollection contas =

new ExtendedInternalCollection("Contas",Conta.class, this);

public TextString getNome() {

return nome;

}

public Title title() {

return getNome().title();

}

public ExtendedInternalCollection getContas() {

return this.contas;

}

(40)

}

SQL Gerado

CREATE TABLE CONTA (

numero VARCHAR(256),

fk_pessoa NUMERIC(10) NOT NULL , id_conta NUMERIC(10) NOT NULL , tipo VARCHAR(256),

CONSTRAINT PK_CONTA PRIMARY KEY (id_conta) );

CREATE TABLE PESSOA (

nome VARCHAR(256),

id_pessoa NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PESSOA PRIMARY KEY (id_pessoa) );

ALTER TABLE CONTA

ADD CONSTRAINT CONTA_PESSOA FOREIGN KEY (fk_pessoa) REFERENCES PESSOA (id_pessoa)

ON DELETE SET NULL

;

(41)

1.3.4 Cardinalidade - Ene para Ene

@Entity

public class FichaInscricao extends AbstractNakedObject {

private final TextString id = new TextString();

@RelationshipAssociation(

cardinality = Cardinality.ManyToMany, relatedWith = Curso.class,

fieldRelatedName = "fichas",

) private final InternalCollection cursos =

new InternalCollection(Curso.class, this);

public TextString getId() {

return id;

}

public InternalCollection getCursos() {

return cursos;

}

public Title title() {

return getId().title();

} } ...

@Entity

(42)

public class Curso extends AbstractNakedObject {

private final TextString nome = new TextString();

private final InternalCollection fichas =

new InternalCollection(FichaInscricao.class, this);

public TextString getNome() {

return nome;

}

public InternalCollection getFichas() {

return fichas;

}

public Title title() {

return getNome().title();

} }

SQL Gerado

CREATE TABLE REL_FICHAINSCRICAO_CURSO (

fk_fichas NUMERIC(10) NOT NULL , fk_cursos NUMERIC(10) NOT NULL ,

CONSTRAINT PK_REL_FICHAINSCRICAO_CURSO PRIMARY KEY (fk_cursos, fk_fichas) );

(43)

CREATE TABLE CURSO (

nome VARCHAR(256),

id_curso NUMERIC(10) NOT NULL ,

CONSTRAINT PK_CURSO PRIMARY KEY (id_curso) );

CREATE TABLE FICHAINSCRICAO (

id_fichainscricao NUMERIC(10) NOT NULL , id VARCHAR(256),

CONSTRAINT PK_FICHAINSCRICAO PRIMARY KEY (id_fichainscricao) );

ALTER TABLE REL_FICHAINSCRICAO_CURSO

ADD CONSTRAINT REL_FICHAINSCRICAO_CURSO_FICHAINSCRICAO FOREIGN KEY (fk_cursos) REFERENCES FICHAINSCRICAO (id_fichainscricao)

ON DELETE CASCADE

;

ALTER TABLE REL_FICHAINSCRICAO_CURSO

ADD CONSTRAINT REL_FICHAINSCRICAO_CURSO_CURSO FOREIGN KEY (fk_fichas) REFERENCES CURSO (id_curso)

ON DELETE CASCADE

;

(44)

1.4 Abstra¸ c˜ ao de Composi¸ c˜ ao

1.4.1 Composi¸c˜ao - L´ogica : Cardinalidade - Um para Um

@Entity

public class Motor extends AbstractNakedObject {

private final TextString nome = new TextString();

private Automovel automovel;

public TextString getNome() {

return nome;

}

public Automovel getAutomovel() {

resolve(automovel);

return automovel;

}

public void setAutomovel(Automovel automovel) {

this.automovel = automovel;

objectChanged();

}

public Title title() {

return getNome().title();

} } ...

(45)

@Entity

public class Automovel extends AbstractNakedObject {

private final TextString id = new TextString();

@CompositeAssociation(

cardinality = Cardinality.OneToOne, relatedWith = Motor.class,

fieldRelatedName = "automovel",

compositeType = CompositeAssociation.CompositeType.Logical ) private Motor motor;

public TextString getId() {

return id;

}

public Motor getMotor() {

resolve(motor);

return motor;

}

public void setMotor(Motor motor) {

this.motor = motor;

objectChanged();

}

public Title title() {

return getId().title();

(46)

} }

SQL Gerado

CREATE TABLE MOTOR (

id_motor NUMERIC(10) NOT NULL , nome VARCHAR(256),

fk_automovel NUMERIC(10) NOT NULL UNIQUE , CONSTRAINT PK_MOTOR PRIMARY KEY (id_motor) );

CREATE TABLE AUTOMOVEL (

id_automovel NUMERIC(10) NOT NULL , id VARCHAR(256),

CONSTRAINT PK_AUTOMOVEL PRIMARY KEY (id_automovel) );

ALTER TABLE MOTOR

ADD CONSTRAINT MOTOR_AUTOMOVEL FOREIGN KEY (fk_automovel) REFERENCES AUTOMOVEL (id_automovel)

ON DELETE CASCADE

;

(47)

1.4.2 Composi¸c˜ao - L´ogica : Cardinalidade - Um para Ene

@Entity

public class Roda extends AbstractNakedObject {

private final TextString numero = new TextString();

private final TextString tipo = new TextString();

private Automovel automovel;

public TextString getNumero() {

return numero;

}

public TextString getTipo() {

return tipo;

}

public Automovel getAutomovel() {

resolve(automovel);

return automovel;

}

public void setAutomovel(Automovel automovel) {

this.automovel = automovel;

objectChanged();

}

public Title title() {

return getNumero().title().append("-", tipo);

}

(48)

} ...

@Entity

public class Automovel extends AbstractNakedObject {

private final TextString nome = new TextString();

@CompositeAssociation(

cardinality = Cardinality.OneToMany, relatedWith = Roda.class,

fieldRelatedName = "automovel",

compositeType = CompositeAssociation.CompositeType.Logical )private final ExtendedInternalCollection rodas =

new ExtendedInternalCollection("Rodas",Roda.class, this);

public TextString getNome() {

return nome;

}

public ExtendedInternalCollection getRodas() {

return rodas;

}

public Title title() {

return getNome().title();

} }

(49)

SQL Gerado

CREATE TABLE RODA (

numero VARCHAR(256),

id_roda NUMERIC(10) NOT NULL , fk_automovel NUMERIC(10) NOT NULL , tipo VARCHAR(256),

CONSTRAINT PK_RODA PRIMARY KEY (id_roda) );

CREATE TABLE AUTOMOVEL (

id_automovel NUMERIC(10) NOT NULL , nome VARCHAR(256),

CONSTRAINT PK_AUTOMOVEL PRIMARY KEY (id_automovel) );

ALTER TABLE RODA

ADD CONSTRAINT RODA_AUTOMOVEL FOREIGN KEY (fk_automovel) REFERENCES AUTOMOVEL (id_automovel)

ON DELETE CASCADE

;

(50)

1.4.3 Composi¸c˜ao - F´ısica : Cardinalidade - Um para Um

@Entity

public class Automovel extends AbstractNakedObject {

private final TextString id = new TextString();

@CompositeAssociation(

cardinality = Cardinality.OneToOne, relatedWith = Motor.class,

fieldRelatedName = "automovel",

compositeType = CompositeAssociation.CompositeType.Physical ) private Motor motor;

public TextString getId() {

return id;

}

public Motor getMotor() {

resolve(motor);

return motor;

}

public void setMotor(Motor motor) {

this.motor = motor;

objectChanged();

}

(51)

public Title title() {

return getId().title();

} } ...

@Entity

public class Motor extends AbstractNakedObject {

private final TextString nome = new TextString();

private Automovel automovel;

public TextString getNome() {

return nome;

}

public Automovel getAutomovel() {

resolve(automovel);

return automovel;

}

public void setAutomovel(Automovel automovel) {

this.automovel = automovel;

objectChanged();

}

public Title title() {

(52)

return getNome().title();

} }

SQL Gerado

CREATE TABLE AUTOMOVEL (

id_automovel NUMERIC(10) NOT NULL , id VARCHAR(256),

CONSTRAINT PK_AUTOMOVEL PRIMARY KEY (id_automovel) );

CREATE TABLE MOTOR (

id_motor NUMERIC(10) NOT NULL , nome VARCHAR(256),

fk_automovel NUMERIC(10) NOT NULL UNIQUE , CONSTRAINT PK_MOTOR PRIMARY KEY (id_motor) );

ALTER TABLE MOTOR

ADD CONSTRAINT MOTOR_AUTOMOVEL FOREIGN KEY (fk_automovel) REFERENCES AUTOMOVEL (id_automovel)

ON DELETE CASCADE

;

(53)

1.4.4 Composi¸c˜ao - F´ısica : Cardinalidade - Um para Ene

@Entity

public class Roda extends AbstractNakedObject {

private final TextString numero = new TextString();

private final TextString tipo = new TextString();

private Automovel automovel;

public TextString getNumero() {

return numero;

}

public TextString getTipo() {

return tipo;

}

public Automovel getAutomovel() {

resolve(automovel);

return automovel;

}

public void setAutomovel(Automovel automovel) {

this.automovel = automovel;

objectChanged();

}

public Title title() {

return getNumero().title().append("-", tipo);

}

(54)

} ...

@Entity

public class Automovel extends AbstractNakedObject {

private final TextString nome = new TextString();

@CompositeAssociation(

cardinality = Cardinality.OneToMany, relatedWith = Roda.class,

fieldRelatedName = "automovel",

compositeType = CompositeAssociation.CompositeType.Physical )private final ExtendedInternalCollection rodas =

new ExtendedInternalCollection("Rodas",Roda.class, this);

public TextString getNome() {

return nome;

}

public ExtendedInternalCollection getRodas() {

return rodas;

}

public Title title() {

return getNome().title();

} }

(55)

SQL Gerado

CREATE TABLE RODA (

numero VARCHAR(256),

id_roda NUMERIC(10) NOT NULL , fk_automovel NUMERIC(10) NOT NULL , tipo VARCHAR(256),

CONSTRAINT PK_RODA PRIMARY KEY (id_roda) );

CREATE TABLE AUTOMOVEL (

id_automovel NUMERIC(10) NOT NULL , nome VARCHAR(256),

CONSTRAINT PK_AUTOMOVEL PRIMARY KEY (id_automovel) );

ALTER TABLE RODA

ADD CONSTRAINT RODA_AUTOMOVEL FOREIGN KEY (fk_automovel) REFERENCES AUTOMOVEL (id_automovel)

ON DELETE CASCADE

;

(56)

1.5 Abstra¸ c˜ ao de Objeto-relacionamento

1.5.1 Cardinalidade - Um para Um

@Entity

public class Resgate extends AbstractNakedObject {

private final TextString condicao = new TextString();

private Conta conta;

private Aplicacao aplicacao;

public TextString getCondicao() {

return condicao;

}

public Conta getConta() {

resolve(conta);

return conta;

}

public void setConta(Conta conta) {

this.conta = conta;

objectChanged();

}

public Aplicacao getAplicacao() {

resolve(aplicacao);

(57)

return aplicacao;

}

public void setAplicacao(Aplicacao aplicacao) {

this.aplicacao = aplicacao;

objectChanged();

}

public Title title() {

Title t = new Title("De");

t.append(" ", getAplicacao());

t.append(" para ", getConta());

return t;

} } ...

@Entity

public class Aplicacao extends AbstractNakedObject {

private final TextString numero = new TextString();

private final TextString tipo = new TextString();

private Resgate resgate;

public TextString getNumero() {

return numero;

}

public TextString getTipo()

(58)

{

return tipo;

}

public Title title() {

return getNumero().title().append("-", tipo);

}

public Resgate getResgate() {

resolve(resgate);

return resgate;

}

public void setResgate(Resgate resgate) {

this.resgate = resgate;

objectChanged();

} } ...

@Entity

public class Conta extends AbstractNakedObject {

private final TextString numero = new TextString();

private final TextString tipo = new TextString();

@RelationshipObject(

cardinality = Cardinality.OneToOne, relatedWith = Aplicacao.class,

(59)

fieldRelatedName = "conta", compositeClass = Resgate.class, compositeFieldName = "resgate",

compositeFieldRelatedName = "aplicacao"

)private Resgate resgate;

public TextString getNumero() {

return numero;

}

public TextString getTipo() {

return tipo;

}

public Title title() {

return getNumero().title().append("-", tipo);

}

public Resgate getResgate() {

resolve(resgate);

return resgate;

}

public void setResgate(Resgate resgate) {

this.resgate = resgate;

objectChanged();

}

(60)

}

SQL Gerado

CREATE TABLE RESGATE (

fk_conta NUMERIC(10) NOT NULL UNIQUE , condicao VARCHAR(256),

id_resgate NUMERIC(10) NOT NULL ,

fk_aplicacao NUMERIC(10) NOT NULL UNIQUE , CONSTRAINT PK_RESGATE PRIMARY KEY (id_resgate) );

CREATE TABLE APLICACAO (

numero VARCHAR(256),

id_aplicacao NUMERIC(10) NOT NULL , tipo VARCHAR(256),

CONSTRAINT PK_APLICACAO PRIMARY KEY (id_aplicacao) );

CREATE TABLE CONTA (

numero VARCHAR(256),

id_conta NUMERIC(10) NOT NULL , tipo VARCHAR(256),

CONSTRAINT PK_CONTA PRIMARY KEY (id_conta) );

ALTER TABLE RESGATE

ADD CONSTRAINT RESGATE_APLICACAO FOREIGN KEY (fk_aplicacao)

(61)

REFERENCES APLICACAO (id_aplicacao) ON DELETE CASCADE

;

ALTER TABLE RESGATE

ADD CONSTRAINT RESGATE_CONTA FOREIGN KEY (fk_conta) REFERENCES CONTA (id_conta)

ON DELETE CASCADE

;

(62)

1.5.2 Cardinalidade - Um para Ene

@Entity

public class Aplicacao extends AbstractNakedObject {

private final TextString numero = new TextString();

private final TextString tipo = new TextString();

private Resgate resgate;

public TextString getNumero() {

return numero;

}

public TextString getTipo() {

return tipo;

}

public Title title() {

return getNumero().title().append("-", tipo);

}

public Resgate getResgate() {

resolve(resgate);

return resgate;

}

public void setResgate(Resgate resgate) {

(63)

this.resgate = resgate;

objectChanged();

} } ...

@Entity

public class Conta extends AbstractNakedObject {

private final TextString numero = new TextString();

private final TextString tipo = new TextString();

@RelationshipObject(

cardinality = Cardinality.OneToMany, relatedWith = Aplicacao.class,

fieldRelatedName = "conta", compositeClass = Resgate.class, compositeFieldName = "resgate",

compositeFieldRelatedName = "aplicacao"

)private final ExtendedInternalCollection resgates =

new ExtendedInternalCollection("Resgates",Resgate.class, this);

public TextString getNumero() {

return numero;

}

public TextString getTipo() {

return tipo;

}

(64)

public Title title() {

return getNumero().title().append("-", tipo);

}

public ExtendedInternalCollection getResgates() {

return resgates;

} } ...

@Entity

public class Resgate extends AbstractNakedObject {

private final TextString condicao = new TextString();

private Conta conta;

private Aplicacao aplicacao;

public TextString getCondicao() {

return condicao;

}

public Conta getConta() {

resolve(conta);

return conta;

}

public void setConta(Conta conta) {

(65)

this.conta = conta;

objectChanged();

}

public Aplicacao getAplicacao() {

resolve(aplicacao);

return aplicacao;

}

public void setAplicacao(Aplicacao aplicacao) {

this.aplicacao = aplicacao;

objectChanged();

}

public Title title() {

Title t = new Title("De");

t.append(" ", getAplicacao());

t.append(" para ", getConta());

return t;

} }

SQL Gerado

CREATE TABLE APLICACAO (

numero VARCHAR(256),

id_aplicacao NUMERIC(10) NOT NULL ,

(66)

tipo VARCHAR(256),

CONSTRAINT PK_APLICACAO PRIMARY KEY (id_aplicacao) );

CREATE TABLE CONTA (

numero VARCHAR(256),

id_conta NUMERIC(10) NOT NULL , tipo VARCHAR(256),

CONSTRAINT PK_CONTA PRIMARY KEY (id_conta) );

CREATE TABLE RESGATE (

fk_conta NUMERIC(10) NOT NULL UNIQUE , condicao VARCHAR(256),

id_resgate NUMERIC(10) NOT NULL , fk_aplicacao NUMERIC(10) NOT NULL ,

CONSTRAINT PK_RESGATE PRIMARY KEY (id_resgate) );

ALTER TABLE RESGATE

ADD CONSTRAINT RESGATE_APLICACAO FOREIGN KEY (fk_aplicacao) REFERENCES APLICACAO (id_aplicacao)

ON DELETE CASCADE

;

ALTER TABLE RESGATE

ADD CONSTRAINT RESGATE_CONTA FOREIGN KEY (fk_conta) REFERENCES CONTA (id_conta)

ON DELETE CASCADE

(67)

;

(68)

1.5.3 Cardinalidade - Ene para Um O mapeamento ´e equivalente ao da Se¸c˜ao 1.5.2.

1.5.4 Cardinalidade - Ene para Ene

@Entity

public class Appointment extends AbstractNakedObject {

private final TextString date = new TextString();

private Patient patient;

private Dentist dentist;

public TextString getDate() {

return date;

}

public Patient getPatient() {

resolve(patient);

return patient;

}

public void setPatient(Patient paciente) {

this.patient = paciente;

objectChanged();

}

public Dentist getDentist() {

(69)

resolve(dentist);

return dentist;

}

public void setDentist(Dentist dentista) {

this.dentist = dentista;

objectChanged();

}

public Title title() {

Title t = getDate().title();

t.append(" ", getDentist());

t.append(" - ", getPatient());

return t;

} } ...

@Entity

public class Dentist extends AbstractNakedObject {

private final TextString name = new TextString();

@RelationshipObject(

cardinality = Cardinality.ManyToMany, relatedWith = Patient.class,

fieldRelatedName = "dentist",

compositeClass = Appointment.class, compositeFieldName = "appointments", compositeFieldRelatedName = "patient"

(70)

)private final ExtendedInternalCollection appointments =

new ExtendedInternalCollection("Appointments",Appointment.class, this);

public ExtendedInternalCollection getAppointments() {

return appointments;

}

public TextString getName() {

return name;

}

public Title title() {

return getName().title();

} } ...

@Entity

public class Patient extends AbstractNakedObject {

private final TextString name = new TextString();

private final ExtendedInternalCollection appointments =

new ExtendedInternalCollection("Appointments",Appointment.class, this);

public ExtendedInternalCollection getAppointments() {

return appointments;

}

(71)

public TextString getName() {

return name;

}

public Title title() {

return getName().title();

} }

SQL Gerado

CREATE TABLE APPOINTMENT (

fk_patient NUMERIC(10) NOT NULL , date VARCHAR(256),

id_appointment NUMERIC(10) NOT NULL , fk_dentist NUMERIC(10) NOT NULL ,

CONSTRAINT PK_APPOINTMENT PRIMARY KEY (id_appointment) );

CREATE TABLE DENTIST (

id_dentist NUMERIC(10) NOT NULL , name VARCHAR(256),

CONSTRAINT PK_DENTIST PRIMARY KEY (id_dentist) );

CREATE TABLE PATIENT (

(72)

name VARCHAR(256),

id_patient NUMERIC(10) NOT NULL ,

CONSTRAINT PK_PATIENT PRIMARY KEY (id_patient) );

ALTER TABLE APPOINTMENT

ADD CONSTRAINT APPOINTMENT_PATIENT FOREIGN KEY (fk_patient) REFERENCES PATIENT (id_patient)

ON DELETE CASCADE

;

ALTER TABLE APPOINTMENT

ADD CONSTRAINT APPOINTMENT_DENTIST FOREIGN KEY (fk_dentist) REFERENCES DENTIST (id_dentist)

ON DELETE CASCADE

;

Referências

Documentos relacionados

Anterior a LVQ está o conceito de Quantização Vetorial (denotada pela sigla em inglês, VQ) [14], [13]. A principal idéia de VQ é formar uma aproximação quantizada dos dados,

Segundo Altan et al, (1999) em processos de conformação de peças metálicas utilizando ferramentas, o atrito, desgastes e lubrificação são fatores que estão presentes

(2008), da escritora Maryse Condé, a relação entre memória e resistência nos processos de construções identitárias da protagonista Tituba, uma negra

Este trabalho apresenta os resultados de tratamento com radiocirurgia estereotáxica (RCE) em 12 pacientes portadores de malformação arteriovenosa cerebral (MAV), com o uso de

Quando aplicável, as operações com instrumentos financeiros derivativos, contratadas pela Companhia e por suas controladas, são mensuradas ao seu valor justo, com as

A ITAÚSA e suas controladas avaliam na data de cada período do relatório a necessidade de reconhecimento de perdas por impairment, para todos os ativos financeiros mensurados ao

Atrav´es das Figuras 4.21(a) e 4.21(b), observamos que ocorre uma queda na densidade de predadores quando consideramos a taxia quase local no cen´ario 3, em compara¸c˜ao com o caso

Consumo dos créditos ativos de acordo com as tarifas do plano do Cliente (aquisições e ativações de créditos Oi Multiuso efetuadas). 7.5 O Cliente poderá, a qualquer