projetos conceituais de banco de dados
Apˆ endice: Mapeamentos
Marcos Eduardo Bolelli Broinizi
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
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
} ...
@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;
}
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) );
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();
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)
{
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)
);
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)
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 )
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();
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)
{
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)
);
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)
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 )
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();
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)
{
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)
);
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)
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();
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();
} }
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;
} }
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),
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)
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();
} }
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();
} }
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()
{
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
(
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
) )
;
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’);
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();
}
} ...
@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) {
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
;
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)
{
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;
} }
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
;
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;
}
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;
}
}
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
;
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
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) );
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
;
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();
} } ...
@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();
} }
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
;
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);
}
} ...
@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();
} }
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
;
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();
}
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() {
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
;
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);
}
} ...
@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();
} }
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
;
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);
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()
{
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,
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();
}
}
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)
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
;
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) {
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;
}
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) {
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 ,
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
;
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() {
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"
)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;
}
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 (
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
;