package br.usp.ime.academicdevoir.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import br.com.caelum.vraptor.ioc.Component;
import br.usp.ime.academicdevoir.entidade.Aluno;
import br.usp.ime.academicdevoir.entidade.Turma;
import br.usp.ime.academicdevoir.entidade.Usuario;
@Component
public class AlunoDao {
/**
* @uml.property name="session"
* @uml.associationEnd multiplicity="(1 1)"
*/
private final Session session;
public AlunoDao(Session session) {
this.session = session;
}
/**
* Cadastra o aluno fornecido no banco de dados.
*
* @param aluno
*/
@SuppressWarnings("unchecked")
public void salvaAluno(Aluno aluno) {
String login = aluno.getLogin();
List<Usuario> listaDeUsuarios = session.createCriteria(Usuario.class)
.add(Restrictions.like("login", login, MatchMode.EXACT))
.list();
if (listaDeUsuarios.size() != 0) return;
Transaction tx = session.beginTransaction();
session.save(aluno);
tx.commit();
}
/**
* Atualiza o aluno fornecido no banco de dados.
*
* @param aluno
*/
public void atualizaAluno(Aluno aluno) {
Transaction tx = session.beginTransaction();
session.update(aluno);
tx.commit();
}
/**
* Remove o aluno fornecido do banco de dados.
*
* @param aluno
*/
public void removeAluno(Aluno aluno) {
Transaction tx = session.beginTransaction();
session.delete(aluno);
tx.commit();
}
/**
* Devolve um Aluno com o id fornecido.
*
* @param id
* @return Aluno
*/
public Aluno carrega(Long id) {
return (Aluno) session.load(Aluno.class, id);
}
@SuppressWarnings("unchecked")
/**
* Devolve uma lista com todos os alunos cadastrados no banco de dados.
*
* @return List<Aluno>
*/
public List<Aluno> listaTudo() {
String nome = "SELECT a FROM Aluno a";
Query query = session.createQuery(nome);
List<Aluno> listaDeAlunos = query.list();
return listaDeAlunos;
}
/**
* Inscreve o aluno na turma com id fornecido.
*
* @param idTurma
*/
public void inscreve(Aluno aluno, Turma turma) {
Transaction tx = session.beginTransaction();
aluno.getTurmas().add(turma);
turma.getAlunos().add(aluno);
session.update(aluno);
session.update(turma);
tx.commit();
}
/**
* Remove a matricula do aluno na turma especificada
* @param aluno
* @param turma
*/
public void removeMatricula(Aluno aluno, Turma turma) {
Transaction tx = session.beginTransaction();
aluno.getTurmas().remove(turma);
turma.getAlunos().remove(aluno);
session.update(aluno);
session.update(turma);
tx.commit();
}
}