Problema inexplicável com JBoss Seam + JPA + Richfaces

0 respostas
carlos.scuna

Fala galera,

Estou com uma problema que realmente ta me deixando sem dormir. Estou implementando
uma aplicação utilizando JBoss Seam com Hibernate (JPA), JSF com Richfaces, HSQLDB no Tomcat.
É uma aplicação bem pequena, mas estou com um problema muito estranho aqui:

O que acontece é o seguinte…

Tenho uma página XHTML de listagem de registros (previsaoMensal.xhtml).

<rich:dataTable id="list"
	value="#{previsaoMensalForm.previsaoMensal.itens}" var="_r">
...
...
...
	<rich:column width="40px">
			<a4j:commandLink action="#{previsaoMensalForm.delete(_r)}" title="Deletar" />
	</rich:column>

</rich:dataTable>

O previsaoMensalForm é um componente Seam:

...
@Name("previsaoMensalForm")
@Scope(ScopeType.PAGE)
public class PrevisaoMensalForm extends AbstractAction implements Serializable {
	private static final long serialVersionUID = -9058096392981154623L;

	@In(create = true)
	private PrevisaoMensalBusiness previsaoMensalBusiness;

	@In(create = true)
	private PrevisaoMensalSearch previsaoMensalSearch;

	...

	public void searchPrevisaoMensal() {
		try {
			PrevisaoMensal previsaoMensal = previsaoMensalSearch.findByCarteiraAndMesAno(getCarteira(), getMesAno());
			setPrevisaoMensal(previsaoMensal);
		} catch (BusinessException e) {
			e.printStackTrace();
		}
	}

	public void delete(PrevisaoMensalItem previsaoMensalItem) {
		try {
			previsaoMensalBusiness.delete(previsaoMensalItem);
		} catch (BusinessException e) {
			mensagens.add(Severity.ERROR, e.getMessage());
			e.printStackTrace();
		}
	}

}

Através do método searchPrevisaoMensal(), eu preencho a lista que é utilizada no rich:dataTable.

Tanto o previsaoMensalBusiness, quando o previsaoMensalSearch contém referência ao EntityManager:

@Name("previsaoMensalBusiness")
public class PrevisaoMensalBusiness {
	@In
	protected EntityManager em;
...
}
@Name("previsaoMensalSearch")
public class PrevisaoMensalSearch {
	@In
	protected EntityManager em;
...
}

Somente o meu componente previsaoMensalForm está como PAGE, os outros estão com o valor default (EVENT).

Quando eu tento deletar, recebo a famosa mensagem do Hibernate:

java.lang.IllegalArgumentException: Removing a detached instance com.meufinanceiro.entity.PrevisaoMensalItem#3.

Faz sentido, lógico, pois a EntityManager que carregou os objetos da lista, no momento em que o método delete() é chamado, já não existe mais. Portanto o objeto _r passado (action="#{previsaoMensalForm.delete(_r)}") é uma instância desligada.

Até aí tudo bem.

Mas se criar outro componente, responsável pela listagem dos dados, aí não tenho mais a mensagem de erro do Hibernate, e a deleção funciona perfeitamente:

<rich:dataTable id="list"
	value="#{previsaoMensalList.previsaoMensal.itens}" var="_r">
...
...
...
	<rich:column width="40px">
			<a4j:commandLink action="#{previsaoMensalForm.delete(_r)}" title="Deletar" />
	</rich:column>

</rich:dataTable>
@Name("previsaoMensalList")
public class PrevisaoMensalList extends ActionList<PrevisaoMensal> {
	private static final long serialVersionUID = 6093519365096958019L;

	private PrevisaoMensal previsaoMensal = new PrevisaoMensal();
	
	@In(create = true)
	protected PrevisaoMensalSearch previsaoMensalSearch;

	@Create
	public void searchPrevisaoMensal() {
		try {			
			PrevisaoMensal previsaoMensal = previsaoMensalSearch.findByCarteiraAndMesAno(carteira, new MesAno());
			setPrevisaoMensal(previsaoMensal);
		} catch (BusinessException e) {
			e.printStackTrace();
		}
	}

...

}

Teoricamente isto também não deveria funcionar, pois a EntityManager utilizada agora para carregar a lista ainda é outra.
Mas mesmo assim o Hibernate não reclama da entidade estar desligada, e eu acredito que ela deveria estar desligada da mesma forma.

Alguém faz ideia do porque o Hibernate/Seam se comporta(m) desta forma ???

Obrigado

Criado 5 de novembro de 2010
Respostas 0
Participantes 1