Criteria

1 resposta
ccefetpb

Estou tentando fazer uma busca dos anuncios de um tipo mais não estou conseguindo , o sistema fica dizendo que a sessão esta fechada - o que e verdade - mas isso não devia ser problema devido a forma como mapiei os beans , alguem pode me ajudar :

@Entity(name="anuncio")
public class Anuncio {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="idanuncio")
	private Integer id;
	
	@Column(name="textotitulo")
	private String titulo;
	
	@Column(name="textoanuncio")
	private String texto;
	
	private Float preco;
	
	@Column(name="nomecontato")
	private String nomeContato;
	
	private String telefone1;
	
	private String telefone2;
	
	@Column(name="datainsercao")
	private String dataInsercao;
	
	//@Column(name="ie_tipoanuncio")
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="idtipoanuncio")
	//@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.ALL)
	private TipoAnuncio tipoAnuncio;
	
	//@Column(name="ie_cliente")
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="idcliente")
	@Cascade(CascadeType.ALL)
	private Cliente cliente;
	
	//@Column(name="ie_sessao")
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="idsessao")
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.ALL)
	private Sessao sessao;
	
	public Integer getId() {
		return id;
	}

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

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public String getTexto() {
		return texto;
	}

	public void setTexto(String texto) {
		this.texto = texto;
	}

	public Float getPreco() {
		return preco;
	}

	public void setPreco(Float preco) {
		this.preco = preco;
	}

	public String getNomeContato() {
		return nomeContato;
	}

	public void setNomeContato(String nomeContato) {
		this.nomeContato = nomeContato;
	}

	public String getTelefone1() {
		return telefone1;
	}

	public void setTelefone1(String telefone1) {
		this.telefone1 = telefone1;
	}

	public String getTelefone2() {
		return telefone2;
	}

	public void setTelefone2(String telefone2) {
		this.telefone2 = telefone2;
	}

	public TipoAnuncio getTipoAnuncio() {
		return tipoAnuncio;
	}

	public void setTipoAnuncio(TipoAnuncio tipoAnuncio) {
		this.tipoAnuncio = tipoAnuncio;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Sessao getSessao() {
		return sessao;
	}

	public void setSessao(Sessao sessao) {
		this.sessao = sessao;
	}

	public void setDataInsercao(String dataInsercao) {
		this.dataInsercao = dataInsercao;
	}

	public String getDataInsercao() {
		return dataInsercao;
	}	
	
	
	
}

@Entity(name="tipoanuncio")
public class TipoAnuncio {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="idtipoanuncio")
	private Integer id;
	
	private String nome;
	
	@Column(name="qtdpalavras")
	private Integer quantidadePalavras;
	
	@OneToMany(mappedBy="tipoAnuncio" , fetch=FetchType.EAGER)
	@Cascade(CascadeType.ALL)
	private List<Anuncio> anuncios;

	public Integer getId() {
		return id;
	}

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

	public String getNome() {
		return nome;
	}

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

	public Integer getQuantidadePalavras() {
		return quantidadePalavras;
	}

	public void setQuantidadePalavras(Integer quantidadePalavras) {
		this.quantidadePalavras = quantidadePalavras;
	}

	public List<Anuncio> getAnuncios() {
		return anuncios;
	}

	public void setAnuncios(List<Anuncio> anuncios) {
		this.anuncios = anuncios;
	}
	
	

}

public List<Anuncio> listarAnunciosTipo(int idTipoAnuncio) throws DBException {
		Anuncio anuncio = new Anuncio();//crio um objeto anuncio
		TipoAnuncio tipoAnuncio = new TipoAnuncio();//crio um tipo
		tipoAnuncio.setId(idTipoAnuncio);//seto o id do tipo com o paramento
		anuncio.setTipoAnuncio(tipoAnuncio);//seto o tipo anuncio do objeto
		return hibernateDao.getBeansByExample(anuncio);//e pronto , era pra funcionar esse metodo chama o de baixo
	}

	public List<T> getBeansByExample(T bean) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		Example example = getExample(bean);
		session.getTransaction().commit();
		return session.createCriteria(classe).add(example).list();
	}
	
	protected Example getExample(T bean)
	{
		Example example = Example.create(bean);
		example.enableLike(MatchMode.START);
		example.ignoreCase();
		example.excludeZeroes();
		return example;
	}

1 Resposta

fabiocsilva

Você poderia usar um spring da vida ou colocar seu sisteminha num Application Server, já que eles gerenciam isso pra você.
Ou, no mínimo, pensar em criar uma variável ThreadLocal lá no seu HibernateUtil. Você vai encontrar vários exemplos na net, até mesmo aqui mesmo no GUJ. O que acontece é que sua session pode ter sido fechada em uma outra thread, já que ela é “global” para suas entidades(porque você coloca os métodos transacionais na própria entidade). O ThreadLocal fará sua entidade enxergar o estado da session no escopo do seu método.

Criado 9 de março de 2010
Ultima resposta 9 de mar. de 2010
Respostas 1
Participantes 2