Duvida sobre modelagem

14 respostas
Zeed01

Boa tarde colegas !

Estou trabalhando com o NetBeans e pedi para criar uma “Classe de Entidade de Banco de Dados” a partir da seguinte tabela:

Tabela: apartamento

Coluna
idCondominio PK, FK da tabela condominio
apartamentoNumero PK
idCliente FK da tabela cliente
idEquipamento FK da tabela equipamento

No entanto o NB gerou duas classes:
-uma chamada ApartamentoPK com dois atributos:
-int apartamentoNumero
-int idCondominio.

-e outra chamada Apartamento com os atributos
-ApartamentoPK apartamentoPK
-Cliente idCliente
-Equipamento idEquipamento

Esta é a melhor forma de representar um objeto Apartamento ?

Se eu fosse criar na mão (e estou tentado a fazer isso), iria criar uma classe apartamento com os atributos:
-int apartamentoNumero
-Condominio condominio
-Cliente cliente
-Equipamento equipamento

Alguem concorda com minha idéia ?
Se não… porque ?
Qual a vantagem da primeira sobre ela, e vice-versa?

Obrigado a todos.

[]s

14 Respostas

tluisrs

Fala ai,

Seguinte, quando você vai modelar um sistema, é recomendável ser feito o modelo OO antes do modelo Relacional (banco de dados). Quando o modelo relacional é feito com base no modelo OO fica muito mais fácil.

No seu caso, recomendo o seguinte. Liste o que você quer saber sobre o apartamento no futuro, tal como ID, Endereço, Condominio, Equipamento, etc. Ai sim você faz a sua classe Apartamento. O que você vai gravar no banco de dados é outro assunto.

E procure saber um pouco mais sobre UML. Ajuda muito.

O que eu disse aqui é UML.

Zeed01

Bom dia colegas !

tluisrs:

Primeiramente muito obrigado pela ajuda !
Mas se não for abusar… eu acho que não entendi muito bem o que quis me dizer, sobre inicar pela modelagem das classes entendi… é que é sempre tentandor utilizar as facilidades do NB ao invés de fazer tudo na mão.

Mas independente disso, veja só:

O que eu quero saber sobre apartamento:

Condominio                                (atributo do tipo Condominio)

NumeroDoApartamento               (atributo do tipo String)

Cliente                                       (Atributo do tipo Cliente)

Equipamento                              (Atributo do tipo Equipamento)

Sendo que quero garantir que não existam dois ou mais apartamentos com o mesmo número para o mesmo condominio.
As classes Condominio, Cliente e Equipamento já existem.

Sendo assim… como ficaria a modelagem da classe Apartamento ?

Se você ou qualquer outro colega do GUJ puder me ajudar, ficarei muito agradecido.

[]s

hover

Boa tarde,

Faria como você falou:

-int apartamentoNumero
-Condominio condominio
-Cliente cliente
-Equipamento equipamento

Deixaria a consistência dos nrs dos apartamentos p/ condomínio p/ o bd, mas caso precise controlar isso numa lista, vc pode usar um Set e implementar os metodos equals e hashCode da classe apartamento.

Esta abordagem pode parecer um pouco mais 'burocratica' mas futuramente vale mto a pena, principalmente no seu caso q vc jah tem as classes Condominio, Cliente e Apartamento prontas.
Zeed01

Boa tarde colegas !

Pensei numa outra opção:

Criar um ID para a tabela Apartamento para fazer a persistencia através deste campo.

Neste caso teria na classe Apartamento:

int idApartamento              //(PK no BD)
    String apartamentoNumero      
    Condomonio condominio
    Cliente cliente
    Equipamento equipamento

Não mudaria muita coisa na implementação… a implantação do Equals seria utilizando apartamentoNumero e condominio.

O que acham ?

[]s

tluisrs

Eu penso de outra maneira.

Um condomínio é um agregado de apartamentos!

Sendo assim, não vejo razão para você ter na sua classe apartamento um atributo do tipo condominio. Claro que o seu jeito de pensar facilita muito a implementação, porque você pode descobrir as informações de um condomínio através de um apartamento.

Mas, em um modelo, eu teria o meu condomínio como um agregado de apartamentos. Porém eu manteria na classe apartamento um atributo (por exemplo idCondominio) para uma referência rápida.

jgbt

se seu software ehc OO nada mais natural que sua modelagem seja OO.
como vc criou uma classe que possui um PK composta, a maneira OO de representar isso eh criar um classe que mapeia sua chave. foi so isso.

[]'s

hover

Um condomínio é um agregado de apartamentos!

Sendo assim, não vejo razão para você ter na sua classe apartamento um atributo do tipo condominio. Claro que o seu jeito de pensar facilita muito a implementação, porque você pode descobrir as informações de um condomínio através de um apartamento.

Mas, em um modelo, eu teria o meu condomínio como um agregado de apartamentos. Porém eu manteria na classe apartamento um atributo (por exemplo idCondominio) para uma referência rápida.

Concordo que o condomínio tenha uma lista de apartamentos, mas eu continuaria com uma referência do condomínio na classe apartamento.

Não acho interessante deixar apenas um idCondominio na classe apartamento. Isso seria uma solução relacional. Mas esse eh um ponto polêmico, tem gente que não vê problema nenhum colocar uma chave num objeto para ‘facilitar’ a implementação inicial, tem outras pessoas que defendem um projeto mais OO, para facilitar a manutenção.

jgbt

idCondominio na classe apartamento
:roll:
estamos falando de banco ou de objetos???
vcs estão modelando objetos pensando em tabelas relacionais…

[]'s

XisPe

A duvida em si é qual é a maneira mais correta de modelar o problema ou como armazenar os dados modelados no sistema (objetos) ?

A modelagem tem que ser feita de maneira que facilite a sua compreensão e deve ser feita antes de se pensar em implementação, ou melhor, nos detalhes de implementação. Claro que seu conhecimento do programa acabará influenciando na modelagem, mas procure “separar suas preocupações”.

Considerando que voce saiba tudo isso que to te falando, uma preocupação que deve-se ter (e que não vi citada aqui) é a representação do banco de dados em algum forma normal. Isso pode alterar o seu MER (modelo entidade-relacionamento), mas (por padrâo) não deve influir drasticamente no seu diagrama de classes…

Espero ter ajudado…

ps: um diagrama de classes em UML e um MER podem lhe ajudar muito a resolver o problema.

Adolfo_Rodrigues

Em todos os projetos em que eu trabalhei até hoje, excetuando-se os particulares, havia a modelagem anêmica. E em todos eles, adaptando para a discussão do tópico, o ApartamentoVO teria uma referência para um CondominioVO.
A sua dúvida, Zeed01, é muito interessante. Ainda mais depois de ver ressuscitada a excelente discussão sobre DAOs nas classes de negócio.

Zeed01

Boa tarde colegas !

Apenas para esclarecer na modelagem da classe Condominio existem um List de Apartamentos…
Esse List como era de se esperar, vai ser populado com todos os apartamentos do condominio.

Confesso que tenho uma briga muito grande para me desligar do modelo estruturado de programação, sempre estou visualizando tabelas do meu BD, etc, etc…

Mas uma coisa eu tinha como certa e gostaria que vocês analisassem:

Se eu tiver uma referencia a Condomio na classe Apartamento, ela deve ser feita a um Objeto Condominio, e não utilizando um int idCondominio.

Já no meu banco de dados relacional terei na tabela apartamento um campo idCondominio que será uma FK da tabela Condominio…

Isso esta correto ?

Obrigado a todos.

[]s

jgbt

Zeed01:

Se eu tiver uma referencia a Condomio na classe Apartamento, ela deve ser feita a um Objeto Condominio, e não utilizando um int idCondominio.

Já no meu banco de dados relacional terei na tabela apartamento um campo idCondominio que será uma FK da tabela Condominio…

Isso esta correto ?

Obrigado a todos.

[]s


sim, se vc vai gerar seu bd a partir dos seus objetos, sera isso que vai acontecer.
mas vc precisa pensar em objetos, nao relacionl. isso vai facilitar sua visão das coisas.

[]'s

Zeed01

Boa tarde de novo colegas !

jgbt

Eu não entendi em que a implementação de uma classe para representar a PK e na classe principal um atributo do tipo ApartamentoPK atende mais OO do que dois atributos na classe principal…

Explicando melhor: não estou dizendo que isso não seja verdade, estou é confessando a minha ignorância.

Na verdade achei mais estranho ainda o seguinte:
Criei uma tabela Teste que só tem dois atributos ID1 e ID2, que juntos compões a PK (obviamente uma situação hipotética para estudo).

Repetindo o mesmo processo utilizado na Classe Apartamento olha o que obtive:

Classe TestePK

package com.atm.DAO;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;

/**
 * Classe de Chave Primária TestePK para classe de entidade Teste
 * 
 * @author r100320
 */
@Embeddable
public class TestePK implements Serializable {

    @Column(name = "ID1", nullable = false)
    private int id1;

    @Column(name = "ID2", nullable = false)
    private int id2;
    
    /** Creates a new instance of TestePK */
    public TestePK() {
    }

    /**
     * Cria uma nova instância de TestePK com os valores especificados.
     * @param id2 o id2 do TestePK
     * @param id1 o id1 do TestePK
     */
    public TestePK(int id2, int id1) {
        this.id2 = id2;
        this.id1 = id1;
    }

    
}

Classe Teste

package com.atm.DAO;

import java.io.Serializable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

/**
 * Classe de entidade Teste
 * 
 * @author r100320
 */
@Entity
@Table(name = "Teste")
@NamedQueries( {
        @NamedQuery(name = "Teste.findById1", query = "SELECT t FROM Teste t WHERE t.testePK.id1 = :id1"),
        @NamedQuery(name = "Teste.findById2", query = "SELECT t FROM Teste t WHERE t.testePK.id2 = :id2")
    })
public class Teste implements Serializable {

    /**
     * Campo de chave primária embutido
     */
    @EmbeddedId
    protected TestePK testePK;
    
    /** Creates a new instance of Teste */
    public Teste() {
    }

    /**
     * Cria uma nova instância de Teste com os valores especificados.
     * @param testePK o testePK do Teste
     */
    public Teste(TestePK testePK) {
        this.testePK = testePK;
    }

    /**
     * Cria uma nova instância de TestePK com os valores especificados.
     * @param id2 o id2 do TestePK
     * @param id1 o id1 do TestePK
     */
    public Teste(int id2, int id1) {
        this.testePK = new TestePK(id2, id1);
    }

}

Minha pergunta: qual a finalidade de TestePK ?

Se puder me explicar fico-lhe grato.

Zeed01

jgbt

O que exatamente significa “pensar em objetos” ?
Pergunto isso porque a minha dúvida surgiu justamente por estar tentando pensar em objetos !

Ou melhor: o que eu quero é um objeto Apartamento, que possui os atributos: numeroDoApartamento, Condominio e Equipamento…

Opa: o que este atributo ApartamentoPK esta fazendo aqui ?

Entendeu minha dúvida ?

[]s

Criado 27 de agosto de 2007
Ultima resposta 29 de ago. de 2007
Respostas 14
Participantes 6