Compartilhamento de EntityManager para web e para swing

Foi exatamente essa pergunta que eu fiz a quem deu ideia.

[quote=lucaonoforum]Foi exatamente essa pergunta que eu fiz a quem deu ideia.[/quote]E o que ele respondeu?

[quote=lucaonoforum]Existem uma ideia na minha equipe de controlar o EntityManager e as transações através de um Filter.

Eu particularmente não gostei da ideia de a cada requisição criar um EntityManager e iniciar uma transação mesmo que ela não seja usada.

Alguém comunga da minha opinião?[/quote]

Eu não usaria.

Eu só ouvi o som do grilo ao longe.

Pessoal eu acabei fazendo assim, Se alguem tive algo há contribuir.

public interface GeneratorId {
	public String getValorId();
}
public class Controlador implements Serializable {

	private static final long serialVersionUID = 1L;
	
	public static GeneratorId gerador; 

	/** */
	private static final EntityManagerFactory emf;
	private static HashMap<String, EntityManager> map = new HashMap<String, EntityManager>();

	static {
		emf = Persistence.createEntityManagerFactory("DAOPU");
	}

	public EntityManager getEntityManager() {
		
		String idAtual = null;
		if (gerador != null){
			idAtual = gerador.getValorId();
		}
		EntityManager em = map.get( idAtual );
		
		if (em == null) {
			em = emf.createEntityManager();
			map.put(idAtual, em);
		}
		return em;
	}
}
public class GeneratorIdControler implements GeneratorId {
	@Override
	public String getValorId() {
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
		return request.getSession().getId();
	}
}

e para usar no JSF, coloquei no Bean Inicial.

static{
	Controlador.gerador = new GeneratorIdControler();
}

Agora me veio a seguinte questão na mente, quando a sessão for finalizada por inatividade o EntityManager vai ficar no hash.

Tem alguma forma algum evento, listener ou alguma anotação que eu saiba que a sessão vai morrer para poder retirar o EntityManager do hash.

Alguem tem alguma ideia?

Alguem tem alguma ideia? Hebert?