Persistencia de Classes

5 respostas
J

bom dia pessoal.
Estou com dificuldades em persistir a seguinte estrutura.

Tenho uma classe Plano que tem uma classe Servico, sendo que esta classe servico pode ser implementada de formas diferentes como Servico de Internet, Servico de Hospedagem…etc, cada uma com suas particularidades. Porem como ficaria isso numa persistencia?
Já que cada uma tem metodos implementados de acordo com o tipo de servico.

Obrigado

5 Respostas

Nicolas_Fernandes

jr.mg:
bom dia pessoal.
Estou com dificuldades em persistir a seguinte estrutura.

Tenho uma classe Plano que tem uma classe Servico, sendo que esta classe servico pode ser implementada de formas diferentes como Servico de Internet, Servico de Hospedagem…etc, cada uma com suas particularidades. Porem como ficaria isso numa persistencia?
Já que cada uma tem metodos implementados de acordo com o tipo de servico.

Obrigado

E aí, cara, tudo bem?
Bom, vamos lá.
Para persistir esses dados, você deve criar suas tabelas no Banco de Dados.

Create Table Servicos (
ID ...,
Nome ...,
// qualquer outro campo
);
Create Table Planos (
ID ...,
Nome ...,
Servico Bigint Not Null,
Foreign Key (Servico) Refences Servicos(ID) // onde servico é uma chave estrangeira para a tabela serviços.
);

Agora, você deve mapear essas tabelas do seu banco de dados em classes.

public class Servico {

    private int ID;
    private String nome;
    //...
}

public class Plano {

    private int ID;
    private String nome;
    private Servico servico;
}

Ou seja: a classe plano possui um objeto persistido que está na tabela Serviços.
Para persistir esses objetos, você cria suas classes DAO.

public class ServicoDAO {

    public void salvar(Servico servico) throws SQLException {

        servico.setID( /*o ID que você vai gerar*/ );

        String query = "Insert Into Servicos (ID, Nome) Values (?, ?)";
        PreparedStatement statement = connection.prepareStatement(query);
        statement.setLong(1, servico.getID());
        statement.setString(2, servico.getNome());
 
        statement.execute();
        statement.close();
    }
}

public class PlanoDAO {

    public void salvar(Plano plano) throws SQLException {

        plano.setID( /*o ID que você vai gerar*/ );

        String query = "Insert Into Planos (ID, Nome, Servico) Values (?, ?, ?)";
        PreparedStatement statement = connection.prepareStatement(query);
        statement.setLong(1, plano.getID());
        statement.setString(2, plano.getNome());
        statement.setLong(3, plano.getServico().getID()); // você tem o objeto serviço que outrora foi cadastrado. Então, você pega o que pertence a esse plano e cadastra o ID dele.
 
        statement.execute();
        statement.close();
    }
}

Sacou mais ou menos?
Agora, o que não entendi: o que você quis dizer com essas “particularidades” dos serviços?
Abraço!

J

As particularidades são assim.
Vamos supor que um desses serviço seja serviço de internet.Nessa classe eu tenho login e outros atributos que são especificos de serviço de internet.
Em outro plano tenho um serviço que é serviço de telefonia.Nessa eu tenho apenas atributos que pertencem a telefonia ex: minutos.

Aí que o bicho pega…pois como fica a persistência disso? E na classe plano eu tenho Serviço ou ServiçoInternet/ServiçoTelefonia.

É issso…

gilmaslima

Nesse caso vc tem duas entidades diferentes, já que elas tem atributos diferenes.

Nicolas_Fernandes
jr.mg:
As particularidades são assim. Vamos supor que um desses serviço seja serviço de internet.Nessa classe eu tenho login e outros atributos que são especificos de serviço de internet. Em outro plano tenho um serviço que é serviço de telefonia.Nessa eu tenho apenas atributos que pertencem a telefonia ex: minutos.

Aí que o bicho pega...pois como fica a persistência disso? E na classe plano eu tenho Serviço ou ServiçoInternet/ServiçoTelefonia.

É issso....

Você pode seguir o conselho do gilmaslima, criando uma entidade para cada um dos planos, já que eles têm suas particularidades. Nesse caso, trabalhe com herança. Crie uma classe mãe que agrege todos os atributos comuns entre os serviços e crie as classes filhas que possuam seus próprios atributos. No banco de dados, crie uma tabela para cada serviço, cada uma com suas particularidades. Acho que assim poderia ficar interessante.
public class Servico {

   private long ID;
   private String nome;
   private String descricao;
}

public class ServicoInternet extends Servico {

   private String login;
   private String senha;
}

public class ServicoTelefonia extends Servico {

   private String assinante;
   private double minutos;
   private double custo;
}

Sacou?

J

Ok…isso está claro
Tinha pensado no uso de interface para implementar os métodos comuns de serviço,utilizando o Pattern Composite com interface Serviço e as classes concretas Plano e Pacote onde o pacote é composto por vários planos.
Só que neste cenário o primeiro problema encontrado foi a persistência das classes concretas que implementam a Interface Serviço.
Estou usando JPA.

Servico s = new Plano();
em.persist(s);
//Aqui dá um erro dizendo que Serviço não é uma entidade.
//Lembrando que Serviço é uma Interface

Estou usando um dao generico para cuidar da persistencia. Talvez se fizermos um cast de Serviço para Plano antes de persistir? Não acho o elegante
Existe alguma tag no JPA que informe que, os dados que precisam ser persistidos são os dados do plano e não serviço?

Foi isso que tentei fazer.

Criado 23 de fevereiro de 2011
Ultima resposta 23 de fev. de 2011
Respostas 5
Participantes 3