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