JPA só traz o resultado de uma entidade many to many

2 respostas
dcorteztec

Bom vamos ver se eu consigo explicar eu tenho duas entidades curso e disciplina com relacionamento many to many, consigo cadastrar e remover, mas não consigo fazer select para trazer os resultados das duas tabelas só trago da tabela curso seperadas, não com junção. vamos aos códigos.

Quando do select e "debugo" o código ele traz só resultado do Curso.

Desde já muito obrigado, olha não é trabalho de faculdade aki no trabalho vai ter uma troca de JDBC para JPA e tenho q aprender rápido

vlw

entidades
package br.com.universidade.entidades;

import java.util.List;


import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;

@NamedQueries({ @NamedQuery(name = "getCurso.Discplina", 
		query = "select c from Curso c inner join c.disciplinas where c.nome like ?1") }
)
@Entity
public class Curso {

	@Id
	@GeneratedValue
	private Long idCurso;

	private String nome;

	private String descricao;

	private int duracao;
	
	

	@ManyToMany(fetch = FetchType.EAGER,cascade=CascadeType.MERGE)
	@JoinTable(name = "curso_disciplina", 
			joinColumns = { @JoinColumn(name = "idCurso") }, 
			inverseJoinColumns = { @JoinColumn(name = "idDisciplina") })
	private List<Disciplina> disciplinas;


	public List<Disciplina> getDisciplinas() {
		return disciplinas;
	}

	public void setDisciplinas(List<Disciplina> disciplinas) {
		this.disciplinas = disciplinas;
	}

	public Long getIdCurso() {
		return idCurso;
	}

	public void setIdCurso(Long idCurso) {
		this.idCurso = idCurso;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public int getDuracao() {
		return duracao;
	}

	public void setDuracao(int duracao) {
		this.duracao = duracao;
	}



	
	
}
package br.com.universidade.entidades;

import java.util.Set;


import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;

@NamedQueries({
@NamedQuery(name="getDisciplina",query="select ct from Disciplina as ct order by nome")		
}
)


@Entity
public class Disciplina {
 
	@Id
	@GeneratedValue
	private Long idDisciplina;
	
	private String nome;

	@ManyToMany(fetch = FetchType.EAGER,cascade=CascadeType.MERGE)
	@JoinTable(name = "curso_disciplina",
	joinColumns = {
	@JoinColumn(name="idDisciplina") 
	},
	inverseJoinColumns = {
	@JoinColumn(name="idCurso")
	}
	)
	private Set<Curso> cursos;
	
	
	public Set<Curso> getCursos() {
		return cursos;
	}

	public void setCursos(Set<Curso> cursos) {
		this.cursos = cursos;
	}

	public Long getIdDisciplina() {
		return idDisciplina;
	}

	public void setIdDisciplina(Long idDisciplina) {
		this.idDisciplina = idDisciplina;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
	
	
}
REPOSITÒRIO
package br.com.universidade.repositorio;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.universidade.DAO.DAO;
import br.com.universidade.entidades.Curso;
import br.com.universidade.entidades.Disciplina;

import br.com.universidade.util.JPAUtil;

public class CursoRepositorio implements DAO<Curso> {

	public void adciona(Curso curso) {
		EntityManager em = (EntityManager) JPAUtil.getInstance()
				.createEntityManager();
		try {
			em.persist(curso);
			em.getTransaction().commit();
		} catch (Exception ex) {
			ex.printStackTrace();
			em.getTransaction().rollback();
		}
	}

	@SuppressWarnings("unchecked")
	public List<Curso> list() {
		EntityManager em = (EntityManager) JPAUtil.getInstance()
				.createEntityManager();
		try {
			Query query = em.createQuery("from Curso");
			em.getTransaction().commit();
			return query.getResultList();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return null;

	}

	public Curso listParametro(String nome) {
		EntityManager em = (EntityManager) JPAUtil.getInstance()
				.createEntityManager();
		try {
			
			Query query =  
				em.createNamedQuery("getCurso.Discplina")
			.setParameter(1, nome + "%");
			
					
			return (Curso)query.getSingleResult();
			
		} catch (Exception ex) {
			ex.printStackTrace();
			return null;
		}
	}

	public void remove(Curso curso) {
		EntityManager em = (EntityManager) JPAUtil.getInstance()
				.createEntityManager();
		try {
			curso = em.merge(curso);
			em.remove(curso);
			em.getTransaction().commit();

		} catch (Exception ex) {
			ex.printStackTrace();
			em.getTransaction().rollback();

		} finally {
			em.close();
		}
	}

	public void update(Curso curso) {
		EntityManager em = (EntityManager) JPAUtil.getInstance()
				.createEntityManager();
		try {
			em.flush();
			em.merge(curso);
			em.getTransaction().commit();
		} catch (Exception ex) {
			ex.printStackTrace();
			em.getTransaction().rollback();
		}

	}


}

BEAN

package br.com.universidade.mb;

import java.util.ArrayList;
import java.util.List;


import javax.faces.bean.ManagedBean;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import br.com.universidade.entidades.Curso;
import br.com.universidade.entidades.Disciplina;
import br.com.universidade.repositorio.CursoRepositorio;


@ManagedBean
public class CursoBean {

	
	private Curso curso = new Curso();
	
	private List<Curso> cursos;
	@SuppressWarnings("rawtypes")
	private DataModel listacurso;
	
	private Disciplina disciplinas = new Disciplina();
	
    CursoRepositorio repositorio = new CursoRepositorio();
	
	public String adciona(){
		CursoRepositorio repositorio = new CursoRepositorio();
		List<Disciplina> armazena =  new ArrayList<Disciplina>();
		armazena.add(disciplinas);
		curso.setDisciplinas(armazena);
		repositorio.adciona(curso);
		return "index";
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public DataModel getListaCurso() {
		cursos = repositorio.list();
		listacurso = new ListDataModel(cursos);
		return listacurso;
	}
	
	public String excluirCurso(){
		Curso cursotemp = (Curso)(listacurso.getRowData());
		repositorio.remove(cursotemp);
		return "index";
	}
	
	
	public String buscar(){
		CursoRepositorio repositorio = new CursoRepositorio();
		List<Disciplina> armazena =  new ArrayList<Disciplina>();
		armazena.add(disciplinas);
		curso.setDisciplinas(armazena);
		this.curso = repositorio.listParametro(this.curso.getNome());
		return "pesquisacurso";
	}
	
	public String preparAlterarCurso(){
		curso = (Curso)(listacurso.getRowData());
		return "pesquisacurso";
		
	}
	
	public String atualiza(){
		CursoRepositorio repositorio = new CursoRepositorio();
		List<Disciplina> armazena =  new ArrayList<Disciplina>();
		armazena.add(disciplinas);
		curso.setDisciplinas(armazena);
		repositorio.update(curso);
		return "index";
	}
	
	
	public Disciplina getDisciplinas() {
		return disciplinas;
	}

	public void setDisciplinas(Disciplina disciplinas) {
		this.disciplinas = disciplinas;
	}

	public Curso getCurso() {
		return curso;
	}

	public void setCurso(Curso curso) {
		this.curso = curso;
	}

	public List<Curso> getCursos() {
		return cursos;
	}

	public void setListcurso(List<Curso> cursos) {
		this.cursos = cursos;
	}
	
	
	
	
}

2 Respostas

V

Tenta isto na sua query:

inner join fetch

dcorteztec

Vlw mas não funcionou continua na msm

meu xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets">
<head>
<title>List</title>
</head>

<body>
<f:view>

	<h:form>
		<h:messages />

		<fieldset><legend>Pesquisa de Cursos</legend> <h:panelGrid
			columns="2">

			<h:commandButton value="Voltar" immediate="true" action="index"
				styleClass="botoes" />
			<h:commandButton value="Adcionar" immediate="true" action="cadcurso"
				styleClass="botoes" />
		</h:panelGrid> 
			<h:inputHidden value="#{cursoBean.curso.idCurso}"
				style=" width : 249px;" />
			<br />
			<h:panelGrid columns="2">
			<h:inputHidden value="#{cursoBean.disciplinas.idDisciplina}"
				style=" width : 249px;" />
			<br />
			<h:outputLabel value="Nome:" />
			<h:inputText value="#{cursoBean.curso.nome}" style=" width : 249px;" />
	
			<h:outputLabel value="Descricão:" />
			<h:inputText value="#{cursoBean.curso.descricao}"
				style=" width : 249px;" />

			<h:outputLabel value="Duração:" />
			<h:inputText value="#{cursoBean.curso.duracao}"
				style=" width : 249px;" />
			<h:outputText value="Disciplina:" />
			<h:inputText value="#{cursoBean.disciplinas.nome}" />
			<h:commandButton action="#{cursoBean.atualiza}" value="Atualiza" />
		</h:panelGrid></fieldset>

	</h:form>
</f:view>
</body>
</html>
Criado 20 de dezembro de 2010
Ultima resposta 20 de dez. de 2010
Respostas 2
Participantes 2