Inserir Coleção Hibernate

7 respostas
H

bom pessoal, estou com o seguinte problema.
tenho um Vector e queria salva-lo no BD sem precisar desmonta-lo e salvar produto a produto no BD utilizando hibernate

vou postar aqui um exemplo de código
private void inserirPlanoIphone(){
		
		Produto produto;
		LeitorProduto leitor = new LeitorProduto();
		
		Vector<Vector<HSSFCell>> vecCellProduto = leitor.LerTabela(); //estou pegando os dados que 
																	//preencherão o objeto produto
																	// em uma tabela do excel
		
		Vector<Produto> vecProduto = new Vector<Produto>(); // aqui ficaram todos os objetos Produto
															// depois de montados
		
		for (Vector<HSSFCell> vecCell : vecCellProduto) { //montando o objeto produto e salvando 
														// no vetor "vecProduto"
			produto = new Produto();
			produto.setNome(vecCell.get(0)+"");
			produto.setTipo(vecCell.get(1)+"");
			produto.setQuantidade(Integer.parseInt(vecCell.get(2)+""));
			produto.setPreco(Double.parseDouble(vecCell.get(3)+""));
			vecProduto.add(produto);
		}
		
		/*
		 * reparem que aqui dei uma solução porca para o problema.
		 * estou desmontando o vecProduto e salvando cada produto dentro dele um a um no BD
		 */
		ProdutoDAO produtoDAO = new ProdutoDAO();
		
		for (Produto produto : vecProduto) {
			produtoDAO.beginTransaction();
			produtoDAO.save(planoIphone);
			produtoDAO.commitAndCloseTransaction();
		}
		
	}

}

7 Respostas

G

Não crie dois tópicos para o mesmo assunto. Crie um e se alguem lhe ajudar, pronto.

Sobre sua duvida, segue um método que utilizo aqui na classe DAO.

public void saveOrUpdateAll(ArrayList<Object> list) throws Exception { Session em = HibernateUtil.getSessionFactory().openSession(); Transaction trans = em.beginTransaction(); try { trans.begin(); for (Object o : list) { em.merge(o); } trans.commit(); } catch (Exception e) { if (trans.isActive()) { trans.rollback(); } e.printStackTrace(); throw e; } finally { em.close(); } }

Como você pode ver, não existe magica que o hibernate faça para inserir tudo de uma vez só.

De qualquer forma, você tem que passar por um for para ele ir inserindo um a um… Mas, pelo menos com um método desse, não na necessidade de você colocar um ‘for’ para cada um que for salvar bastando apenas mandar a lista de objetos.

Abraços

H

Me desculpe em relação a criação de dois tópicos iguais, é que no primeiro topico quando eu apertei em “Enviar” deu um erro de salvação, dai então pensei pq tinha postado porque o nome do topico estava muito grande ( se puder pode dar uma olhada no horario em que foi postado os dois posts ), bom mas btw muito obrigado pela atenção !
então a forma que fiz não está tããããão porca assim :slight_smile:

G

Então, o bom de você usar desse jeito que postei é o seguinte. Já tentou dar update em todas colunas de um JTable?

Com esse código que lhe postei, ficaria assim:

ArrayList<Object> l = new ArrayList<Object>(); for(Object o : tableModel.getData()){ l.add(o); } try { dao.saveOrUpdateAll(l); JOptionPane.showMessageDialog(null, "Deu certo!"); } catch (Exception ex) { Logger.getLogger(CadPlanejamentoHoras.class.getName()).log(Level.SEVERE, null, ex); }

Ajuda demais esse Dao Generico. Se quiser, posso te mandar…

Abraços

H

Opa ! se puder me mandar eu ficaria grato :D

eu uso essa classe de DAO generica em todas minhas aplicações que utilizo hibernate
queria deixar claro que peguei essa GenericDAO neste exemplo do blog uaihebert.

http://uaihebert.com/?p=1414

btw ai vai a classe generica que uso

abstract class GenericDAO<T> implements Serializable {
	private static final long serialVersionUID = 1L;

	private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("JSFCrudPU");
	private EntityManager em;

	private Class<T> entityClass;

	public void beginTransaction() {
		em = emf.createEntityManager();

		em.getTransaction().begin();
	}

	public void commit() {
		em.getTransaction().commit();
	}

	public void rollback() {
		em.getTransaction().rollback();
	}

	public void closeTransaction() {
		em.close();
	}

	public void commitAndCloseTransaction() {
		commit();
		closeTransaction();
	}

	public void flush() {
		em.flush();
	}

	public void joinTransaction() {
		em = emf.createEntityManager();
		em.joinTransaction();
	}

	public GenericDAO(Class<T> entityClass) {
		this.entityClass = entityClass;
	}

	public void save(T entity) {
		em.persist(entity);
	}

	public void delete(T entity) {
		T entityToBeRemoved = em.merge(entity);

		em.remove(entityToBeRemoved);
	}

	public T update(T entity) {
		return em.merge(entity);
	}

	public T find(int entityID) {
		return em.find(entityClass, entityID);
	}

	public T findReferenceOnly(int entityID) {
		return em.getReference(entityClass, entityID);
	}

	// Using the unchecked because JPA does not have a
	// em.getCriteriaBuilder().createQuery()<T> method
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public List<T> findAll() {
		CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
		cq.select(cq.from(entityClass));
		return em.createQuery(cq).getResultList();
	}

	// Using the unchecked because JPA does not have a
	// query.getSingleResult()<T> method
	@SuppressWarnings("unchecked")
	protected T findOneResult(String namedQuery, Map<String, Object> parameters) {
		T result = null;

		try {
			Query query = em.createNamedQuery(namedQuery);

			// Method that will populate parameters if they are passed not null and empty
			if (parameters != null && !parameters.isEmpty()) {
				populateQueryParameters(query, parameters);
			}

			result = (T) query.getSingleResult();

		} catch (NoResultException e) {
			System.out.println("No result found for named query: " + namedQuery);
		} catch (Exception e) {
			System.out.println("Error while running query: " + e.getMessage());
			e.printStackTrace();
		}

		return result;
	}

	private void populateQueryParameters(Query query, Map<String, Object> parameters) {
		for (Entry<String, Object> entry : parameters.entrySet()) {
			query.setParameter(entry.getKey(), entry.getValue());
		}
	}
}

Agora vou dar um jeito de adaptar esse seu método nela, pra deixa-la mais completa :D

G

Se não me engano, peguei o GenericDao que utilizo aqui de um site americano.. agora não estou lembrado ao certo qual foi.

Coloquei uns metodos que estava precisando também...

package Utilitarios;
 
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
 
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
 
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import Model.Cliente;
 
/**
 * @author SAMUEL FACCHINELLO
 * @version 1.0
 */


public class GenericDao {


    
    public static List executeHQLList(String hql){
        Session em = HibernateUtil.getSessionFactory().openSession();
        Query query = em.createQuery(hql);
        List<Object> lista = query.list();
        em.clear();
        em.close();
        return lista;
    }
    
     public static List findSpecify(Object classe, String column, Object content) {
	Session em = HibernateUtil.getSessionFactory().openSession();
        Query query = em.createQuery("Select c from " + classe.getClass().getName() + " c where " + column + " Like '%" + content + "%'");
        List<Object> lista = query.list();
        em.clear();
        em.close();
        return lista;
       }
     
     public static List findByNamedQuery(Object classe, String namedQuery, String column, Object value) {
	Session em = HibernateUtil.getSessionFactory().openSession();
        Query query = em.getNamedQuery(namedQuery).setParameter(column, value);
        List<Object> lista = query.list();
        em.clear();
        em.close();
        return lista;
       }
     
 /**
  * Salva ou Atualiza dependendo se j&#65533; existe ou n&#65533;o o objeto no banco de dados. 
  * @param o: Entidade a ser Salva (se ainda n&#65533;o existir) ou a ser Atualizada (se j&#65533; existir)
  * @return Retorna a Entidade passada como par&#65533;metro.
  * @throws Exception
  */
 public Object saveOrUpdate(Object o) throws Exception {
	 System.out.println("Veio no save or update");
  Session em = HibernateUtil.getSessionFactory().openSession();
  Transaction trans = em.beginTransaction();
  try {
   em.merge(o);
   trans.commit();
   return o;
  } catch (Exception e) {
   if (trans.isActive()) {
    trans.rollback();
   }
   e.printStackTrace();
   throw e;
  } finally {
   em.close();
  }
 }
 
 /**
  * Salva ou Atualiza dependendo se j&#65533; existe ou n&#65533;o o objeto no banco de dados. 
  * @param list: lista das Entidades a serem Salvas (se ainda n&#65533;o existir) ou a serem Atualizadas (se j&#65533; existir)
  * @return Retorna a Entidade passada como par&#65533;metro.
  * @throws Exception
  */
 public void saveOrUpdateAll(ArrayList<Object> list) throws Exception {
	  Session em = HibernateUtil.getSessionFactory().openSession();
  Transaction trans = em.beginTransaction();
  try {
   trans.begin();
   for (Object o : list) {
    em.merge(o);
   }
   trans.commit();
  } catch (Exception e) {
   if (trans.isActive()) {
    trans.rollback();
   }
   e.printStackTrace();
   throw e;
  } finally {
   em.close();
  }
 }
 
 /**
  * Remove a Entidade do banco de dados.
  * @param o: Entidade a ser removido do banco de dados.
  * @throws Exception
  */
 public void remove(Object o) throws Exception {
	  Session em = HibernateUtil.getSessionFactory().openSession();
  Transaction trans = em.beginTransaction();
  try {
   em.delete(o);
   trans.commit();
  } catch (Exception e) {
   if (trans.isActive()) {
    trans.rollback();
   }
   throw e;
  } finally {
   em.close();
  }
 }
 
 /**
  * Remove a Entidade do banco de dados.
  * @param list: Lista de Entidades a serem removidas do banco de dados.
  * @throws Exception
  */
 public void removeAll(ArrayList<Object> list) throws Exception {
	  Session em = HibernateUtil.getSessionFactory().openSession();
  Transaction trans = em.beginTransaction();
  try {
   trans.begin();
   for (Object o : list) {
    em.delete(o);
   }
   trans.commit();
  } catch (Exception e) {
   if (trans.isActive()) {
    trans.rollback();
   }
   throw e;
  } finally {
   em.close();
  }
 }
 
 /**
  * Retorna a lista de itens salvo no banco de dados de acordo com a Entidade passada como par&#65533;metro.
  * @param classe : Entidade que dever&#65533; buscar no banco de dados.
  * @return List contendo todos os objetos encontrados da entidade passada como par&#65533;metro.
  */
 public static List findAll(Object classe) {
	  Session em = HibernateUtil.getSessionFactory().openSession();
          
          Query query = em.createQuery("Select a from " + classe.getClass().getName() + " a");
          List<Object> lista = query.list();
          em.clear();
          em.close();
          return lista;
 }
 
 /**
  * Faz a busca no banco pelo ID da entidade
  * @param classe : Entidade a ser buscada
  * @param id : valor a ser procurado
  * @return Objeto encontrado no banco, caso n&#65533;o encontre ser&#65533; retornado NULL
  * @throws Exception
  */
 @SuppressWarnings("unchecked")
 public static Object findById(Class classe, Object id) throws Exception {
  if (classe == null) {
   throw new Exception("classe n&#65533;o pode ser nula.");
  }
 
  if (id == null) {
   throw new Exception("id n&#65533;o pode ser nulo.");
  }
 
  Field[] fields = classe.getDeclaredFields();
  String chave = "";
  for (Field field : fields) {
   if (field.getAnnotation(Id.class) != null) {
    chave = field.getName();
    break;
   }
  }
 
  if (chave.equals("")) {
   throw new Exception("Annotation @Id n&#65533;o encontrada na classe " + classe.getName());
  }
 
  Session em = HibernateUtil.getSessionFactory().openSession();
  Query query = em.createQuery("Select a from " + classe.getName() + " a" +
          " where a." + chave + " = :id").setParameter("id", id);
  query.setMaxResults(1);
  return query.uniqueResult();
 }
 
 /**
  * Retorna objeto de acordo com a UniqueConstraint definida na Entidade
  * @param classe : Entidade a ser buscada
  * @param ids : Array contendo os IDS a serem buscados (na mesma ordem em que a UniqueConstraint foi definido)
  * @return Objeto encontrado no banco, caso n&#65533;o encontre ser&#65533; retornado NULL 
  * @throws Exception
  */
 @SuppressWarnings("unchecked")
 public static Object findByUniqueConstraints(Class classe, ArrayList<Object> ids) throws Exception {
  if (classe == null) {
   throw new Exception("classe n&#65533;o pode ser nula.");
  }
 
  if (ids == null || ids.size() == 0) {
   throw new Exception("ids n&#65533;o pode ser nulo.");
  }
 
  ArrayList<String> chaves = new ArrayList<String>();
  ArrayList<Class> tipos = new ArrayList<Class>();
  Annotation annotation = classe.getAnnotation(Table.class);
  if (annotation != null) {
   Table table = (Table) annotation;
 
   for (UniqueConstraint uniqueConstraint : table.uniqueConstraints()) {
    for (String column : uniqueConstraint.columnNames()) {
     tipos.add(classe.getDeclaredField(column).getType());
     chaves.add(column);
    }
   }
  } else {
   throw new Exception("Annotation @Table n&#65533;o encontrada na classe " + classe.getName());
  }
 
  if (chaves.size() == 0) {
   throw new Exception("UniqueConstraints n&#65533;o encontrada na annotation @Table da classe " + classe.getName());
  }
 
  if (chaves.size() != ids.size()) {
   throw new Exception("O n&#65533;mero de par&#65533;metros passados n&#65533;o confere com o n&#65533;mero de UniqueConstraints encontrados na classe " + classe.getName() + ". " + ids.size() + " foram passados, mas " + chaves.size() + " eram esparados.");
  }
 
  String str = "";
  for (int i = 0; i < chaves.size(); i++) {
   if (!ids.get(i).getClass().equals(tipos.get(i))) {
    throw new Exception("Tipos de dados incompat&#65533;veis. O par&#65533;metro n&#65533;mero " + i + " &#65533; incompat&#65533;vel, foi passado:" + ids.get(i).getClass().toString() + " e estava esperando: " + tipos.get(i).toString());
   }
   if (str.length() == 0) {
    str = " where a." + chaves.get(i) + " = " + ids.get(i);
   } else {
    str += " and " + chaves.get(i) + " = " + ids.get(i);
   }
  }
 
  Session em = HibernateUtil.getSessionFactory().openSession();
  Query query = em.createQuery("Select a from " + classe.getName() + " a " + str);
  query.setMaxResults(1);
  return query.uniqueResult();
 }
}

Abraços

----------- Editando ------------

Repare como meu ingles é bom, olhe o nome do método findSpecify kkkkkkkkkkkkk... Que vergonha mano!! Pá acaba mesmo hehe

N

hamisterbr, a ideia é que você não tem como fugir do loop, se este é o seu problema.
Você tem uma quantidade X de registros. Você deve percorrer um a um para inserí-los no seu SGBD.

Agora, caso você queira deixar isso transparente, você pode fazer um método, em seu DAO, que receba uma coleção e itere sobre ela.
public void saveOrUpdate(List<Classe> lista) throws HibernateException {

    Session session = HibernateUtils.getSessionFactory().openSession();
    Transaction transaction = session.beginTransaction();

    try {
        for (Classe item : lista) {
            session.saveOrUpdate(item);
        }
        transaction.commit();
    }
    catch (HibernateException hibernateException) {
        if (transaction.isActive()) {
            transaction.rollback();
        }
    }
    finally {
        transaction.close();
        session.close();
    }
}
E, ao usar:
List<Classe> lista = new ArrayList<Classe>();
//popula sua coleção...

try {
    DAO.saveOrUpdate(lista);
}
catch (HibernateException hibernateException) {
     hibernateException.printStackTrace();
}

Espero ter ajudado,
fique com Deus! :D

H

Problema resolvido, então eu adicionei mais dois métodos na minha classe GenericDAO

public void saveAll (List<T> list){ for (T entity : list) { em.persist(entity); } }

e

public List<T> updateAll (List<T> list){ for (T entity : list) { em.merge(entity); } return list; }

Criado 10 de outubro de 2012
Ultima resposta 11 de out. de 2012
Respostas 7
Participantes 3