Duvida sobre constraints

3 respostas
cristianovieira

Olá boa noite venho mais uma vez pedir auxilio aos Srs. dessa vez para tratar de uma duvida sobre constraint. Pois bem analise o cenário abaixo:

Telefone (Classe Abstrata)
TelPessoa

Pessoa(Classe Abstrata)
Cliente

Bom a 5 minutos atraz recebi a exception “No row with the given identifier exists”, isso por que algum registro de telefone estava apontando para uma pessoa que não existia, presumi que seria por que o relacionamento via anotation esta sendo feito assim:

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="pess_id", updatable=true, insertable=true)
@Fetch(FetchMode.JOIN)
private Pessoa pessoa;

Ou seja apontando para uma classe abstrata, tenho N pessoas tais como “Cliente”, “Fornecedor”, “Motorista” etc… Como a aplicação ainda está em fase de implementação posso fazer qualquer modificação as perguntas são:

1º Seria o caso de ter um relacionamento UniDirecional para que as pessoas apontem para telefone mas telefone n apontar para ninguem ?
2º a Exception gerada foi pq telefone tava apontando para uma classe Abstrata ?

Obrigado pessoal

3 Respostas

drsmachado

E pessoa está mapeada como? @Entity ou @MappedSuperclass?

drsmachado

Outra coisa, constraint não tem nada a ver com o mapeamento que você está utilizando.
Constraint é uma regra explicitada à determinado banco de dados/schema, tabela ou coluna, para que a integridade dos dados seja mantida.
Constraints podem ser criadas pelo DBA (ou pela pessoa que irá manipular o banco, mesmo que seja a tia do café) ou pelo banco de dados, como quando determinamos que uma coluna é primary key, o SGBD entende que esta não pode ter valores duplicados, mas, não somos nós que limitamos, o próprio ajusta uma constraint para evitar isso.
São também utilizadas em relacionamentos, pois, só assim há a integridade das tabelas (lembremos que integridade é uma propriedade dos bancos de dados, mas não uma responsabilidade, isto é dever de quem o manipula).

cristianovieira

Olá drsmachado obrigado pela explicação e pela resposta. Bom eu abri o tópico sobre constraint por que cheguei a conclusão (talvez erroneamente ou não) que:

1º O banco cria uma fk de cada relacionamento, no caso de telefone eu tenho os relacionamento de tel para usuario, tel para tipo de telefone e tel para pessoa, o unico relacionamento que não foi feito a fk foi a de pessoa que é a unica classe nesses relacionamentos que é abstrata, logo liguei uma coisa na outra ou seja, não fez a fk por que é abstrata.

2º Estou usando o SchemaExport para montar o meu banco, ou seja as configurações do banco e integridade é o reflexo das configurações das classes.

Sobre o mapeamento de Pessoa para Telefone como solicitado segue abaixo:

@OneToMany(mappedBy=pessoa)

@Cascade(CascadeType.ALL)

private List telpessoa;

O que me diz sobre sanar este problema com o mapeamento unidirecional ? ou seja… Pessoa tem TEL mas TEL não tem Pessoa. O que acha ?

Criado 1 de fevereiro de 2012
Ultima resposta 2 de fev. de 2012
Respostas 3
Participantes 2