Problemas com DAO genérico

6 respostas
dahenz

Bom dia a todos!

Estou fazendo um DAO genérico para facilitar meu desenvolvimento, e estou com uma dúvida ao buscar um objeto no banco passando sua primary key.

Segue meu método:

@Override
	public <T> T getObject(Class<T> clazz, Long pk) {
		// TODO Auto-generated method stub

		T obj = null;
		
		try {
			this.session = MySQLDAOFactory.openSession(false);
			obj = (T) this.session.load(clazz, pk);
						
			MySQLDAOFactory.closeCurrentSession();
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			this.tx.rollback();
			MySQLDAOFactory.closeCurrentSession();
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			this.tx.rollback();
			MySQLDAOFactory.closeCurrentSession();
			e.printStackTrace();
		}
		
		return obj;

	}

Esse método é chamado pela classe PessoaDAO como segue:

public PessoaBean getPessoa(Long id){
		
		PessoaBean pessoaBean = (PessoaBean) super.getObject(PessoaBean.class, id);
		
		return pessoaBean;
		
	}

Quando eu faço um teste através de uma classe main apresenta o seguinte erro:

20:49:36,834 ERROR LazyInitializationException:19 - could not initialize proxy - the owning Session was closed
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:60)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:140)
at br.com.totemsistemas.alta_vista.bean.PessoaBean$$EnhancerByCGLIB$$d1eda875.getNome()
at br.com.totemsistemas.alta_vista.Test.main(Test.java:12)
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:60)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:140)
at br.com.totemsistemas.alta_vista.bean.PessoaBean$$EnhancerByCGLIB$$d1eda875.getNome()
at br.com.totemsistemas.alta_vista.Test.main(Test.java:12)

Alguém passou por isso? Como resolvo?? Obrigado.

6 Respostas

T

Mostre como o Seu “main”
Pelo que estou vendo no erro, parece que você está tentando acessar algum relacionamento do tipo “Lazy” e a sessão já foi fechada, ou você não abriu a mesma…

dahenz

O método que eu chamo de main:

public class Test {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {

		PessoaDAO dao = new PessoaDAO();		
		System.out.println(dao.getPessoa(new Long(1)).getNome());
		
	}
	
}

Eu estancio a classe PessoaDAO que extende de DAO, possuindo o método getPessoa() como segue:

public PessoaBean getPessoa(Long id){
		
		PessoaBean pessoaBean = new PessoaBean();
		Hibernate.initialize(pessoaBean);
		pessoaBean = (PessoaBean) super.getObject(PessoaBean.class, id);		
		
		return pessoaBean;
		
	}

O erro está nesse método?

xxjamisxx

na hora que vc crior sua entity vc coloco algum lazy ??

T

Classe PessoaBean tá faltando…

dahenz

Não criei como Lazy....

Criei ela normalmente como segue:

@Entity @Table(name="pessoas")
public class PessoaBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@Id @GeneratedValue
	private Long id;	
	private String nome;
	private String endereco;
	private String bairro;
	private String cep;
	@OneToOne
	@JoinColumn(name="cidade")
	private CidadeBean cidade;
	private String telefone;
	private String celular;
	private String email;
	@Column(name="cpf_cnpj")
	private String cpfCnpj;
	@Column(name="rg_ie")
	private String rgIe;
	@Column(name="tipo_pessoa")
	private String tipoPessoa;

	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public String getBairro() {
		return bairro;
	}
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}
	public String getCep() {
		return cep;
	}
	public void setCep(String cep) {
		this.cep = cep;
	}
	public CidadeBean getCidade() {
		return cidade;
	}
	public void setCidade(CidadeBean cidade) {
		this.cidade = cidade;
	}
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	public String getCelular() {
		return celular;
	}
	public void setCelular(String celular) {
		this.celular = celular;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getCpfCnpj() {
		return cpfCnpj;
	}
	public void setCpfCnpj(String cpfCnpj) {
		this.cpfCnpj = cpfCnpj;
	}
	public String getRgIe() {
		return rgIe;
	}
	public void setRgIe(String rgIe) {
		this.rgIe = rgIe;
	}
	public String getTipoPessoa() {
		return tipoPessoa;
	}
	public void setTipoPessoa(String tipoPessoa) {
		this.tipoPessoa = tipoPessoa;
	}
	public static long getSerialVersionUID() {
		return serialVersionUID;
	}
		
}
dahenz

Funcionou, mas da seguinte forma:

No meu método getObject, da classe DAO na linha 11 eu comento o código, então nao fecho minha conexão. Meio esquisito, gostaria de achar outra forma…

Criado 9 de janeiro de 2011
Ultima resposta 10 de jan. de 2011
Respostas 6
Participantes 3