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
privatevoidinserirPlanoIphone(){Produtoproduto;LeitorProdutoleitor=newLeitorProduto();Vector<Vector<HSSFCell>>vecCellProduto=leitor.LerTabela();//estou pegando os dados que //preencherão o objeto produto// em uma tabela do excelVector<Produto>vecProduto=newVector<Produto>();// aqui ficaram todos os objetos Produto// depois de montadosfor(Vector<HSSFCell>vecCell:vecCellProduto){//montando o objeto produto e salvando // no vetor "vecProduto"produto=newProduto();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 */ProdutoDAOprodutoDAO=newProdutoDAO();for(Produtoproduto:vecProduto){produtoDAO.beginTransaction();produtoDAO.save(planoIphone);produtoDAO.commitAndCloseTransaction();}}}
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
hamisterbr
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
G
Gleidson_Henrique
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
hamisterbr
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.
abstractclassGenericDAO<T>implementsSerializable{privatestaticfinallongserialVersionUID=1L;privatestaticfinalEntityManagerFactoryemf=Persistence.createEntityManagerFactory("JSFCrudPU");privateEntityManagerem;privateClass<T>entityClass;publicvoidbeginTransaction(){em=emf.createEntityManager();em.getTransaction().begin();}publicvoidcommit(){em.getTransaction().commit();}publicvoidrollback(){em.getTransaction().rollback();}publicvoidcloseTransaction(){em.close();}publicvoidcommitAndCloseTransaction(){commit();closeTransaction();}publicvoidflush(){em.flush();}publicvoidjoinTransaction(){em=emf.createEntityManager();em.joinTransaction();}publicGenericDAO(Class<T>entityClass){this.entityClass=entityClass;}publicvoidsave(Tentity){em.persist(entity);}publicvoiddelete(Tentity){TentityToBeRemoved=em.merge(entity);em.remove(entityToBeRemoved);}publicTupdate(Tentity){returnem.merge(entity);}publicTfind(intentityID){returnem.find(entityClass,entityID);}publicTfindReferenceOnly(intentityID){returnem.getReference(entityClass,entityID);}// Using the unchecked because JPA does not have a// em.getCriteriaBuilder().createQuery()<T> method@SuppressWarnings({"unchecked","rawtypes"})publicList<T>findAll(){CriteriaQuerycq=em.getCriteriaBuilder().createQuery();cq.select(cq.from(entityClass));returnem.createQuery(cq).getResultList();}// Using the unchecked because JPA does not have a// query.getSingleResult()<T> method@SuppressWarnings("unchecked")protectedTfindOneResult(StringnamedQuery,Map<String,Object>parameters){Tresult=null;try{Queryquery=em.createNamedQuery(namedQuery);// Method that will populate parameters if they are passed not null and emptyif(parameters!=null&&!parameters.isEmpty()){populateQueryParameters(query,parameters);}result=(T)query.getSingleResult();}catch(NoResultExceptione){System.out.println("No result found for named query: "+namedQuery);}catch(Exceptione){System.out.println("Error while running query: "+e.getMessage());e.printStackTrace();}returnresult;}privatevoidpopulateQueryParameters(Queryquery,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
Gleidson_Henrique
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...
packageUtilitarios;importjava.lang.annotation.Annotation;importjava.lang.reflect.Field;importjava.util.ArrayList;importjava.util.List;importjavax.persistence.Id;importjavax.persistence.Table;importjavax.persistence.UniqueConstraint;importorg.hibernate.Query;importorg.hibernate.Session;importorg.hibernate.Transaction;importModel.Cliente;/** * @author SAMUEL FACCHINELLO * @version 1.0 */publicclassGenericDao{publicstaticListexecuteHQLList(Stringhql){Sessionem=HibernateUtil.getSessionFactory().openSession();Queryquery=em.createQuery(hql);List<Object>lista=query.list();em.clear();em.close();returnlista;}publicstaticListfindSpecify(Objectclasse,Stringcolumn,Objectcontent){Sessionem=HibernateUtil.getSessionFactory().openSession();Queryquery=em.createQuery("Select c from "+classe.getClass().getName()+" c where "+column+" Like '%"+content+"%'");List<Object>lista=query.list();em.clear();em.close();returnlista;}publicstaticListfindByNamedQuery(Objectclasse,StringnamedQuery,Stringcolumn,Objectvalue){Sessionem=HibernateUtil.getSessionFactory().openSession();Queryquery=em.getNamedQuery(namedQuery).setParameter(column,value);List<Object>lista=query.list();em.clear();em.close();returnlista;}/** * 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 */publicObjectsaveOrUpdate(Objecto)throwsException{System.out.println("Veio no save or update");Sessionem=HibernateUtil.getSessionFactory().openSession();Transactiontrans=em.beginTransaction();try{em.merge(o);trans.commit();returno;}catch(Exceptione){if(trans.isActive()){trans.rollback();}e.printStackTrace();throwe;}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 */publicvoidsaveOrUpdateAll(ArrayList<Object>list)throwsException{Sessionem=HibernateUtil.getSessionFactory().openSession();Transactiontrans=em.beginTransaction();try{trans.begin();for(Objecto:list){em.merge(o);}trans.commit();}catch(Exceptione){if(trans.isActive()){trans.rollback();}e.printStackTrace();throwe;}finally{em.close();}}/** * Remove a Entidade do banco de dados. * @param o: Entidade a ser removido do banco de dados. * @throws Exception */publicvoidremove(Objecto)throwsException{Sessionem=HibernateUtil.getSessionFactory().openSession();Transactiontrans=em.beginTransaction();try{em.delete(o);trans.commit();}catch(Exceptione){if(trans.isActive()){trans.rollback();}throwe;}finally{em.close();}}/** * Remove a Entidade do banco de dados. * @param list: Lista de Entidades a serem removidas do banco de dados. * @throws Exception */publicvoidremoveAll(ArrayList<Object>list)throwsException{Sessionem=HibernateUtil.getSessionFactory().openSession();Transactiontrans=em.beginTransaction();try{trans.begin();for(Objecto:list){em.delete(o);}trans.commit();}catch(Exceptione){if(trans.isActive()){trans.rollback();}throwe;}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. */publicstaticListfindAll(Objectclasse){Sessionem=HibernateUtil.getSessionFactory().openSession();Queryquery=em.createQuery("Select a from "+classe.getClass().getName()+" a");List<Object>lista=query.list();em.clear();em.close();returnlista;}/** * 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")publicstaticObjectfindById(Classclasse,Objectid)throwsException{if(classe==null){thrownewException("classe n�o pode ser nula.");}if(id==null){thrownewException("id n�o pode ser nulo.");}Field[]fields=classe.getDeclaredFields();Stringchave="";for(Fieldfield:fields){if(field.getAnnotation(Id.class)!=null){chave=field.getName();break;}}if(chave.equals("")){thrownewException("Annotation @Id n�o encontrada na classe "+classe.getName());}Sessionem=HibernateUtil.getSessionFactory().openSession();Queryquery=em.createQuery("Select a from "+classe.getName()+" a"+" where a."+chave+" = :id").setParameter("id",id);query.setMaxResults(1);returnquery.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")publicstaticObjectfindByUniqueConstraints(Classclasse,ArrayList<Object>ids)throwsException{if(classe==null){thrownewException("classe n�o pode ser nula.");}if(ids==null||ids.size()==0){thrownewException("ids n�o pode ser nulo.");}ArrayList<String>chaves=newArrayList<String>();ArrayList<Class>tipos=newArrayList<Class>();Annotationannotation=classe.getAnnotation(Table.class);if(annotation!=null){Tabletable=(Table)annotation;for(UniqueConstraintuniqueConstraint:table.uniqueConstraints()){for(Stringcolumn:uniqueConstraint.columnNames()){tipos.add(classe.getDeclaredField(column).getType());chaves.add(column);}}}else{thrownewException("Annotation @Table n�o encontrada na classe "+classe.getName());}if(chaves.size()==0){thrownewException("UniqueConstraints n�o encontrada na annotation @Table da classe "+classe.getName());}if(chaves.size()!=ids.size()){thrownewException("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.");}Stringstr="";for(inti=0;i<chaves.size();i++){if(!ids.get(i).getClass().equals(tipos.get(i))){thrownewException("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);}}Sessionem=HibernateUtil.getSessionFactory().openSession();Queryquery=em.createQuery("Select a from "+classe.getName()+" a "+str);query.setMaxResults(1);returnquery.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
Nicolas_Fernandes
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.