cara, foi mau, esqueci de te falar em cima,
seu facade seria o ejb, vc teria algo assim
xhtml - controller (@ManagedBean) - facade (@Ejb) - DAO (vc injeta o @@PersistenceContext uma unica vez na classe base)
segue um exemplo do base dao
package br.com.bingo.dao;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TemporalType;
import org.hibernate.Session;
public abstract class BaseDAO<T> {
@PersistenceContext
private EntityManager entityManager;
protected BaseDAO(){
}
public void inserir(T object) {
entityManager.persist(object);
entityManager.flush();
}
public T alterar(T object) {
object = entityManager.merge(object);
entityManager.flush();
return object;
}
public void excluir(Class<T> classe, Object id) {
entityManager.remove(entityManager.find(classe, id));
entityManager.flush();
}
@SuppressWarnings("rawtypes")
protected void excluirClausulaIN(String sql, HashMap<String, Object> parametros){
Session session = (Session) entityManager.getDelegate();
org.hibernate.Query query = session.createQuery(sql);
if(parametros != null && !parametros.keySet().isEmpty()){
for(String parametro : parametros.keySet()){
if(parametros.get(parametro) instanceof List){
query.setParameterList(parametro, (List)parametros.get(parametro));
}else{
query.setParameter(parametro, parametros.get(parametro));
}
}
}
query.executeUpdate();
}
public void executeNativeQuery(Class<T> classe, String sql, HashMap<String, Object> parametros) {
Query query = entityManager.createNativeQuery(sql, classe);
if(parametros != null && !parametros.keySet().isEmpty()){
for(String parametro : parametros.keySet()){
query.setParameter(parametro, parametros.get(parametro));
}
}
query.executeUpdate();
}
public T pesquisar(Class<T> classe, Object id) {
return (T) entityManager.find(classe, id);
}
@SuppressWarnings("unchecked")
protected List<T> pesquisarEntidades(String sql, HashMap<String, Object> parametros, boolean todos, int primeiroResultado, int maxResultado){
Query query = entityManager.createQuery(sql);
if(parametros != null && !parametros.keySet().isEmpty()){
for(String parametro : parametros.keySet()){
if(parametros.get(parametro) instanceof Date){
query.setParameter(parametro, (Date)parametros.get(parametro), TemporalType.DATE);
}else{
query.setParameter(parametro, parametros.get(parametro));
}
}
}
if (!todos) {
query.setMaxResults(maxResultado);
query.setFirstResult(primeiroResultado);
}
return query.getResultList();
}
@SuppressWarnings({ "rawtypes", "unchecked" })
protected List<T> pesquisarEntidadesClausulaIN(String sql, HashMap<String, Object> parametros, boolean todos, int primeiroResultado, int maxResultado){
Session session = (Session) entityManager.getDelegate();
org.hibernate.Query query = session.createQuery(sql);
if(parametros != null && !parametros.keySet().isEmpty()){
for(String parametro : parametros.keySet()){
if(parametros.get(parametro) instanceof List){
query.setParameterList(parametro, (List)parametros.get(parametro));
}else{
query.setParameter(parametro, parametros.get(parametro));
}
}
}
if (!todos) {
query.setMaxResults(maxResultado);
query.setFirstResult(primeiroResultado);
}
return query.list();
}
protected List<T> pesquisarEntidades(String sql, HashMap<String, Object> parametros){
return pesquisarEntidades(sql, parametros, true, 0, 0);
}
protected List<T> pesquisarEntidades(String sql){
return pesquisarEntidades(sql, null, true, 0, 0);
}
protected List<T> pesquisarEntidadesClausulaIN(String sql, HashMap<String, Object> parametros){
return pesquisarEntidadesClausulaIN(sql, parametros, true, 0, 0);
}
protected List<T> pesquisarEntidadesClausulaIN(String sql){
return pesquisarEntidadesClausulaIN(sql, null, true, 0, 0);
}
@SuppressWarnings("unchecked")
protected List<T> pesquisarEntidadesNativeQuery(Class<T> classe, String sql, HashMap<String, Object> parametros, boolean todos, int primeiroResultado, int maxResultado){
Query query = entityManager.createNativeQuery(sql, classe);
if(parametros != null && !parametros.keySet().isEmpty()){
for(String parametro : parametros.keySet()){
query.setParameter(parametro, parametros.get(parametro));
}
}
if (!todos) {
query.setMaxResults(maxResultado);
query.setFirstResult(primeiroResultado);
}
return query.getResultList();
}
@SuppressWarnings("unchecked")
protected T pesquisarEntidadeNativeQuery(Class<T> classe, String sql, HashMap<String, Object> parametros){
try {
Query query = entityManager.createNativeQuery(sql, classe);
if(parametros != null && !parametros.keySet().isEmpty()){
for(String parametro : parametros.keySet()){
if(parametros.get(parametro) instanceof Date){
query.setParameter(parametro, (Date)parametros.get(parametro), TemporalType.TIMESTAMP);
}else{
query.setParameter(parametro, parametros.get(parametro));
}
}
}
return (T) query.getSingleResult();
} catch (Exception e) {
return null;
}
}
@SuppressWarnings("unchecked")
protected List<T> pesquisarEntidadesNativeQuery(String sql, HashMap<String, Object> parametros, boolean todos, int primeiroResultado, int maxResultado){
Query query = entityManager.createNativeQuery(sql);
if(parametros != null && !parametros.keySet().isEmpty()){
for(String parametro : parametros.keySet()){
query.setParameter(parametro, parametros.get(parametro));
}
}
if (!todos) {
query.setMaxResults(maxResultado);
query.setFirstResult(primeiroResultado);
}
return query.getResultList();
}
@SuppressWarnings("unchecked")
protected T pesquisarEntidade(String sql, HashMap<String, Object> parametros) throws NoResultException{
try{
Query query = entityManager.createQuery(sql);
if(!parametros.keySet().isEmpty()){
for(String parametro : parametros.keySet()){
if(parametros.get(parametro) instanceof Date){
query.setParameter(parametro, (Date)parametros.get(parametro), TemporalType.TIMESTAMP);
}else{
query.setParameter(parametro, parametros.get(parametro));
}
}
}
return (T) query.getSingleResult();
}catch(Exception e){
return null;
}
}
}
t+