Minha dúvida é: _Os métodos de Inserção, Remoção, Listagem e Ordenação, por exemplo, de cada objeto dentro do model, precisam estar dentro da propria classe? ou posso criar classes genericas como “Inserir”, “Remover” e “Ordenar” dentro do package model para trabalhar os objetos?.
Se você der uma pesquisada rápida na internet vai ver que existem as classes DAO (Data Access Object), que são classes construídas para manipular as operações CRUD (Create, Read, Update e Delete).
Dê uma estudada a respeito e monte seu próprio padrão de acordo com a estrutura do seu projeto.
A estrutura depende do nível de abstração que você quer ou precisa ou vale a pena utilizar. É comum ainda encontrar os métodos hashCode( ), equals( ) e toString( ) nas classes model dependendo das tecnologias que estão sendo utilizadas no projeto.
Como foi citado acima, normalmente as operações CRUD são utilizadas em classes do tipo DAO e normalmente se inicia utilizando uma classe de CRUD para cada model e posteriormente utiliza-se DAOs genéricos que proporcionam implementação única de operações CRUD para todas as classes model.
.
Na minha opinião, tanto faz, podem estar na próprio objeto, em outra genérica para fazer as operações ou nas duas ao mesmo tempo, entretanto, para melhor organização, recomendo que separe as classes que tem como responsabilidade de armazenar as informações (dados) como a classe Estacao das classes que executam tarefas no sistema.
Vc não explicou direito o “Inserir”, “Remover” e “Ordenar”, se uma classe Escola possui uma lista de Estudantes, vc pode colocar esses métodos na classe Escola pois a Escola é a responsável por guardar os Estudantes, mas se vc refere a banco de dados, é melhor criar uma classe DAO para representar o banco de dados que é a responsável por guardar os dados. Nesse ultimo caso, poderia colocar os métodos na entidade, mas sempre ligando a um DAO, exemplo:
public class Estacao {
public void inserirNoBanco() {
EstacaoDao.inserir(this);
}
}
No caso escola:
public class Estudante {
public void inserirNaEscola(Escola escola) {
escola.inserir(this);
}
}
@_Appelt Meu objetivo realmente é criar de forma genérica uma classe que manipule todos os models. Ainda não estudei sobre operação CRUD e Classes DAO, mas pelo que já me explicpou pude entender do que se trata. Obrigado pela ajuda, vou pesquisar mais!
@diego12 Entendi. para fins de desacoplamento, e agora que foi me apresentado as nomeclaturas DAO e CRUD, pesquisarei mais para que meu código fique mais ou menos assim:
public class Estudante implements GenericDao {
.....
}
public class Main {
public static void main (String[] args...) {
Estudante estudante = new Estudante();
estudante.InserirGenerico(TabelaEstudante,DadoColuna1,DadoColuna2,DadoColuna3...);
}
}
Vou exemplificar o que eu costumo utilizar com relação a DAO generico.
Começo pela organização dos pacotes, tenho um para DAO e outro para a implementação dos DAO;
O pacote DAO vai conter as interfaces DAO começando pela interface de DAO generico:
public interface IGenericDAO<T> extends java.io.Serializable {
T create(T t);
T read(Object id);
T update(T t);
List<T> findAll();
{....}
}
e as interfaces dos outros Model:
public interface ICityDAO<T> extends IGenericDAO<T>{
}
O pacote de implementação dos DAOs tem a implementação do DAO generico e das outras interfaces
public class GenericDAOImpl<T> implements IGenericDAO<T> {
private Class<T> entityClass;
//nome do Persistence Unit
protected static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("WSteste");
protected EntityManager entityManager;
public GenericDAOImpl() {
entityManager = emf.createEntityManager();
}
public GenericDAOImpl(Class<T> entityClass) {
this.entityClass = entityClass;
entityManager = emf.createEntityManager();
}
@Override
public T create(T t) {
this.entityManager.persist(t);
return t;
}
@Override
public T read(Object id) {
return this.entityManager.find(entityClass, id);
}
{....}
}
E as outras interfaces
public class CityDAOImpl extends GenericDAOImpl<City> implements ICityDAO<City> {
public CityDAOImpl() {
super(City.class);
}
}
E ai para utilizar toda a estrutura basta criar e instanciar um objeto da classe de implementação do DAO genérico e passar como parametro o objeto do model ja com as informações setadas.
Country pais = new Country();
CountryDAOImpl dao = new CountryDAOImpl();
pais.setNome("nome");
dao.create(pais)