Inserir Coleção Hibernate

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

[code]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();
	}
	
}

}[/code]

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

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:

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

Opa ! se puder me mandar eu ficaria grato :smiley:

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

[code]abstract class GenericDAO 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());
	}
}

}[/code]

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

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…

[code]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� existe ou n�o o objeto no banco de dados.
  • @param o: Entidade a ser Salva (se ainda n�o existir) ou a ser Atualizada (se j� existir)
  • @return Retorna a Entidade passada como par�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� existe ou n�o o objeto no banco de dados.
  • @param list: lista das Entidades a serem Salvas (se ainda n�o existir) ou a serem Atualizadas (se j� existir)
  • @return Retorna a Entidade passada como par�metro.
  • @throws Exception
    */
    public void saveOrUpdateAll(ArrayList 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 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�metro.

  • @param classe : Entidade que dever� buscar no banco de dados.

  • @return List contendo todos os objetos encontrados da entidade passada como par�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�o encontre ser� retornado NULL
  • @throws Exception
    */
    @SuppressWarnings(“unchecked”)
    public static Object findById(Class classe, Object id) throws Exception {
    if (classe == null) {
    throw new Exception(“classe n�o pode ser nula.”);
    }

if (id == null) {
throw new Exception(“id n�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�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�o encontre ser� retornado NULL
  • @throws Exception
    */
    @SuppressWarnings(“unchecked”)
    public static Object findByUniqueConstraints(Class classe, ArrayList ids) throws Exception {
    if (classe == null) {
    throw new Exception(“classe n�o pode ser nula.”);
    }

if (ids == null || ids.size() == 0) {
throw new Exception(“ids n�o pode ser nulo.”);
}

ArrayList chaves = new ArrayList();
ArrayList tipos = new ArrayList();
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�o encontrada na classe " + classe.getName());
}

if (chaves.size() == 0) {
throw new Exception("UniqueConstraints n�o encontrada na annotation @Table da classe " + classe.getName());
}

if (chaves.size() != ids.size()) {
throw new Exception("O n�mero de par�metros passados n�o confere com o n�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�veis. O par�metro n�mero " + i + " � incompat�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();
}
}[/code]

Abraços

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

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

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.

[code]public void saveOrUpdate(List 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();
}

}[/code]

E, ao usar:

[code]List lista = new ArrayList();
//popula sua coleção…

try {
DAO.saveOrUpdate(lista);
}
catch (HibernateException hibernateException) {
hibernateException.printStackTrace();
}
[/code]

Espero ter ajudado,
fique com Deus! :smiley:

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; }