Dúvidas com padrão Repository

2 respostas
fsoad

Pessoal, tudo bom? Sou iniciante em desenvolvimento Java e mais ainda com o Hibernate, e estou apanhando um pouco para fazer as coisas funcionarem aqui… não fui eu que fiz esta estrutura, então não posso fugir muito dela (pois existem outras classes que dependem dela).

Seguinte, eu tenho uma classe mapeada com a seguinte estrutura:

Classe Aluno:

package br.edu.ufsj.dcomp.requerimentosDicon.models;

import javax.persistence.*;

@javax.persistence.Entity

@Table(name=alunos)

public class Aluno extends Entity {
@Column(name="MATRICULA")
private String matricula;

   @Column(name="CPF")
   private String cpf;


public void setCpf(String cpf) {
	this.cpf = cpf;
}

public String getCpf() {
	return cpf;
}

public void setMatricula(String matricula) {
	this.matricula = matricula;
}

public String getMatricula() {
	return matricula;
}

}

Classe Entity (que é herdada por Aluno):

package br.edu.ufsj.dcomp.requerimentosDicon.models;

import javax.persistence.GeneratedValue;

import <a href="http://javax.persistence.Id">javax.persistence.Id</a>;

import javax.persistence.MappedSuperclass;

@MappedSuperclass
public class Entity {

@Id @GeneratedValue
private Long id;

public void setId(Long id) {
	this.id = id;
}

public Long getId() {
	return id;
}

@Override
public boolean equals(Object obj) {
	if (obj == null) {
		return false;
	}
	if (this == obj) {
		return true;
	}
	if (getClass() != obj.getClass()) {
		return false;
	}
	final Entity other = (Entity) obj;
	if (id != other.id && (id == null || !id.equals(other.id))) {
		return false;
	}
	return true;
}

@Override
public int hashCode() {
	int hash = 7;
	hash = 17 * hash + (this.getId() != null ? this.getId().hashCode() : 0);
	return hash;
}

}

Aluno Repository:

package br.edu.ufsj.dcomp.requerimentosDicon.repositories;

import java.util.List;

import br.edu.ufsj.dcomp.requerimentosDicon.models.Aluno;

public interface AlunoRepository {
/*
* Delete the methods you don’t want to expose
*/

void create(Aluno entity);

Aluno update(Aluno entity);

void destroy(Aluno entity);

Aluno find(Long id);

List<Aluno> findAll();

}

AlunoRepositoryImpl


package br.edu.ufsj.dcomp.requerimentosDicon.repositories;

import javax.persistence.EntityManager;

import br.com.caelum.vraptor.ioc.Component;
import br.edu.ufsj.dcomp.requerimentosDicon.models.Aluno;

@Component

public class AlunoRepositoryImpl

extends Repository<Aluno, Long>

implements AlunoRepository {
AlunoRepositoryImpl(EntityManager entityManager) {
	super(entityManager);
}

}

Acontece que, para esta classe, eu não queria usar ‘id’ como a chave primária… gostaria de usar ‘matricula’ como tal. Fiz algumas tentativas aqui, como parar de estender a classe Entity e fazer as annotations direto na classe Aluno, mas foram todas frustradas… eu estava recebendo um http error 503 quando tentava acessar no servidor…

Enfim, alguém tem alguma ideia de quais modificações eu deveria fazer pra conseguir usar ‘matricula’ como chave primária? Se precisarem de mais detalhes, é só me pedir… desculpem o post corrido, é que estou meio sem tempo aqui agora, mas depois consigo mandar mais detalhes, se for preciso.

Agradeço desde já (:

2 Respostas

A

Uma das alternativas é justamente fazer aluno não herdar de Entity e mapear matrícula como a chave primária. Que exception deu quando tentou isso?

Agora a minha dúvida é: por que não quer usar Id como pk ?

fsoad

Consegui resolver (:
Eu só tinha esquecido de atualizar o tipo de uma variável no RepositoryImpl, bobeira minha…

AbelBueno, não quero modificar o banco pois ele já está populado, e é utilizado por outros sistemas aos
quais eu não tenho acesso.

Obrigado mesmo assim.

Agora outras dúvidas me surgiram:

  • Qual é a forma mais correta de fazer validações sobre os meus dados? Por exemplo, impedir o usuário de inserir uma matrícula que já exista no BD.
  • Preciso reimplementar os métodos equals e hashCode na classe Aluno?
  • E se eu precisar usar uma chave primária composta como id, como faço?
  • O que é a classe I no Java?
Criado 18 de outubro de 2012
Ultima resposta 18 de out. de 2012
Respostas 2
Participantes 2