Fórum Problema no persistence unit #399985
29/04/2011
0
Estou com um grande problema em um projeto web, quando crio uma classe entity automática no netbeans e criando uma conexao com o postgresql e depois vou no persistence.xml e vejo que ele nao criou os property do banco de dados da conexão que deveria ter, já procurei fazer todos os tipos de testes e nada, estou usando o netbeans 7 glassfish 3.1 jsf 2.0 e Hibernate , o problema é que quando persisto um dado ele não encontra o banco gerando essa mensagem,
javax.persistence.PersistenceException: [PersistenceUnit: ab] Unable to build EntityManagerFactory
vcs teriam ideia do que seja??
Lembrando estou utilizando o NetBeans 7GlassFish 3.1Jsf 2.0HibernateJPA 1
Agradeço
Jefferson Alves
Curtir tópico
+ 0Posts
29/04/2011
Anthony Accioly
Você poderia postar o seu persistence.xml?
Há dois tipos de configuração possíveis:
Apontar o endereço JNDI de um datasource configurado no Glassfish (veja que nesse caso você não precisa especificar detalhes de conexão com o banco pois o próprio server já as contém):
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="sample"> <jta-data-source>java:/DefaultDS</jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> </properties> </persistence-unit></persistence>
Ou configurar diretamente o detalhes do banco no persistence.xml:
<persistence> <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL"> <class>org.hibernate.ejb.test.Cat</class> <class>org.hibernate.ejb.test.Distributor</class> <class>org.hibernate.ejb.test.Item</class> <properties> <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/> <property name="javax.persistence.jdbc.user" value="sa"/> <property name="javax.persistence.jdbc.password" value=""/> <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:."/> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/ <property name="hibernate.max_fetch_depth" value="3"/> <!-- cache configuration --> <property name="hibernate.ejb.classcache.org.hibernate.ejb.test.Item" value="read-write"/> <property name="hibernate.ejb.collectioncache.org.hibernate.ejb.test.Item.distributors" value="read-write, RegionName"/> <!-- alternatively to <class> and <property> declarations, you can use a regular hibernate.cfg.xml file --> <!-- property name="hibernate.ejb.cfgfile" value="/org/hibernate/ejb/test/hibernate.cfg.xml"/ --> </properties> </persistence-unit></persistence>
Enquanto o primeiro tipo de configuração te trás uma série de vantagens (transações controladas por container, não precisar mexer no arquivo de configuração da aplicação para mudar de ambiente de desenvolvimento para produção, etc). O segundo te dá mais controle (e históricamente é mais fácil de testar... Você não irá precisar recorrer a containers embbeded e coisas do tipo).
Exemplos retirados daqui: http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/configuration.html
Gostei + 0
29/04/2011
Jefferson Alves
Olha meu persistence.xml
<?xml version="1.0" encoding="UTF-8"?><persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="TreinamentoPU" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>treinamento</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit></persistence>
inseri os dois códigos e me retorna o seguinte erro:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325) at javax.naming.InitialContext.lookup(InitialContext.java:392) at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52) at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124) at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:29) at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62) at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33) at br.pb.sistcomp.util.HibernateUtil.(HibernateUtil.java:21) at br.pb.sistcomp.util.HibernateUtil.getInstance(HibernateUtil.java:26) at br.pb.sistcomp.dao.LeilaoDaoImpl.(LeilaoDaoImpl.java:20) at test.Test.main(Test.java:19)Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: sample] Unable to build EntityManagerFactory at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33) at br.pb.sistcomp.util.HibernateUtil.(HibernateUtil.java:21) at br.pb.sistcomp.util.HibernateUtil.getInstance(HibernateUtil.java:26) at br.pb.sistcomp.dao.LeilaoDaoImpl.(LeilaoDaoImpl.java:20) at test.Test.main(Test.java:19)Caused by: org.hibernate.HibernateException: Could not find datasource at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:56) at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124) at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:29) at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62) at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669) ... 7 moreCaused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325) at javax.naming.InitialContext.lookup(InitialContext.java:392) at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52) ... 14 more
É como se o meu EntityManagerFactory não sincronizasse com persistence.xml, até pq como vc viu meu persistence.xml não gera a sincronização com o banco, eu crio esse persistence.xml e faço as configurações do banco, mas mesmo ele gera o que está acima.
Gostei + 0
29/04/2011
Anthony Accioly
Tenta a segunda opção que eu te mandei para configurar o banco na unha através da aplicação.
Abraços,
Gostei + 0
29/04/2011
Jefferson Alves
Exatamento estou rodando no glassfish 3.1, e o meu banco é o postgresql está bem configurando, já fiz um teste utilizando o tomcat e rodou normalmente, juro que não sei o que fazer para solucionar esse bug, fiz os testes que você e mesmo assim está dando erro.
Esse erro acontece quando tento persistir algo no banco.
Como falei uso as mesmas clases em outro projeto utilizando o tomcat e roda normalmente.
Aguardo.
Gostei + 0
29/04/2011
Anthony Accioly
Tente especificar os dados do banco diretamente no persistence.xml como no segundo exemplo de código que te passei. Se continuar me dando erro, posta ele aqui.
Abraços,
Gostei + 0
29/04/2011
Anthony Accioly
Quando você diz que está bem configurado, você colocou o driver do banco na pasta lib do glassfish,entrou no console do Glassfish, configurou o datasource e fez um teste de ping né? Depois configurou o acesso via JNDI e testou o acesso direto? Consegue acessar o datasource diretamente via JNDI usando
context.lookup()
Gostei + 0
29/04/2011
Jefferson Alves
<persistence xmlns="http://java.sun.com/xml/ns/persistence"> <persistence-unit name="treinamentoPU" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.connection.username" value="desenv"/> <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> <property name="hibernate.connection.password" value="desenv"/> <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/treinamento"/> <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/> <property name="hibernate.hbm2ddl.auto" value="update"/> <!-- cache configuration --> <property name="hibernate.ejb.classcache.org.hibernate.ejb.test.Item" value="read-write"/> <property name="hibernate.ejb.collectioncache.org.hibernate.ejb.test.Item.distributors" value="read-write, RegionName"/> <!-- alternatively to <class> and <property> declarations, you can use a regular hibernate.cfg.xml file --> <!-- property name="hibernate.ejb.cfgfile" value="/org/hibernate/ejb/test/hibernate.cfg.xml"/ --> </properties> </persistence-unit></persistence>
error
run:Apr 29, 2011 8:19:13 PM org.hibernate.cfg.annotations.Version <clinit>INFO: Hibernate Annotations 3.3.1.GAApr 29, 2011 8:19:13 PM org.hibernate.cfg.Environment <clinit>INFO: Hibernate 3.2.5Apr 29, 2011 8:19:13 PM org.hibernate.cfg.Environment <clinit>INFO: hibernate.properties not foundApr 29, 2011 8:19:13 PM org.hibernate.cfg.Environment buildBytecodeProviderINFO: Bytecode provider name : cglibApr 29, 2011 8:19:13 PM org.hibernate.cfg.Environment <clinit>INFO: using JDK 1.4 java.sql.Timestamp handlingApr 29, 2011 8:19:13 PM org.hibernate.ejb.Version <clinit>INFO: Hibernate EntityManager 3.3.2.GAApr 29, 2011 8:19:13 PM org.hibernate.cfg.AnnotationBinder bindClassINFO: Binding entity from annotated class: br.pb.sistcomp.entity.MensagemApr 29, 2011 8:19:13 PM org.hibernate.cfg.annotations.EntityBinder bindTableINFO: Bind entity br.pb.sistcomp.entity.Mensagem on table MensagemApr 29, 2011 8:19:13 PM org.hibernate.cfg.AnnotationBinder bindClassINFO: Binding entity from annotated class: br.pb.sistcomp.entity.ProdutoApr 29, 2011 8:19:13 PM org.hibernate.cfg.annotations.EntityBinder bindTableINFO: Bind entity br.pb.sistcomp.entity.Produto on table ProdutoApr 29, 2011 8:19:13 PM org.hibernate.cfg.AnnotationBinder bindClassINFO: Binding entity from annotated class: br.pb.sistcomp.entity.PessoaApr 29, 2011 8:19:13 PM org.hibernate.cfg.annotations.EntityBinder bindTableINFO: Bind entity br.pb.sistcomp.entity.Pessoa on table PessoaApr 29, 2011 8:19:13 PM org.hibernate.cfg.AnnotationBinder bindClassINFO: Binding entity from annotated class: br.pb.sistcomp.entity.VendaApr 29, 2011 8:19:13 PM org.hibernate.cfg.annotations.EntityBinder bindTableINFO: Bind entity br.pb.sistcomp.entity.Venda on table VendasApr 29, 2011 8:19:13 PM org.hibernate.cfg.AnnotationBinder bindClassINFO: Binding entity from annotated class: br.pb.sistcomp.entity.LanceApr 29, 2011 8:19:13 PM org.hibernate.cfg.annotations.EntityBinder bindTableINFO: Bind entity br.pb.sistcomp.entity.Lance on table LanceApr 29, 2011 8:19:13 PM org.hibernate.cfg.AnnotationBinder bindClassINFO: Binding entity from annotated class: br.pb.sistcomp.entity.LeilaoApr 29, 2011 8:19:13 PM org.hibernate.cfg.annotations.EntityBinder bindTableINFO: Bind entity br.pb.sistcomp.entity.Leilao on table leiloesException in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: treinamentoPU] Unable to configure EntityManagerFactory at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:265) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:125) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33) at br.pb.sistcomp.util.HibernateUtil.<init>(HibernateUtil.java:21) at br.pb.sistcomp.util.HibernateUtil.getInstance(HibernateUtil.java:26) at br.pb.sistcomp.dao.LeilaoDaoImpl.<init>(LeilaoDaoImpl.java:20) at test.LeilaoTest.main(LeilaoTest.java:19)Caused by: org.hibernate.MappingException: Cannot cache an unknown entity: org.hibernate.ejb.test.Item at org.hibernate.cfg.Configuration.setCacheConcurrencyStrategy(Configuration.java:1959) at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:293) at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1115) at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1225) at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:159) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:854) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:191) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:253) ... 7 moreJava Result: 1BUILD SUCCESSFUL (total time: 1 second)
Classe Hibernate Util
package br.pb.sistcomp.util;
import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;//import javax.persistence.Persistence;
/** * * @author georgelima1 */public class HibernateUtil { private static HibernateUtil hu; private static EntityManagerFactory emf;
private HibernateUtil(){ emf = Persistence.createEntityManagerFactory("treinamentoPU"); }
public static HibernateUtil getInstance(){ if(hu == null){ hu = new HibernateUtil(); return hu; } return hu; }
public EntityManagerFactory getFactory(){ return emf; }
}
Classe LeilaoDao
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package br.pb.sistcomp.dao;
import br.pb.sistcomp.entity.Leilao;import java.util.List;import javax.persistence.EntityManager;import br.pb.sistcomp.util.HibernateUtil;import java.util.ArrayList;import java.util.Date;
/** * * @author jefferson */public class LeilaoDaoImpl implements LeilaoDao {
private EntityManager em = HibernateUtil.getInstance().getFactory().createEntityManager();
@Override public void addLeilao(Leilao leilao) {
em.getTransaction().begin();
em.persist(leilao); em.getTransaction().commit();
}
@Override public Leilao removeLeilao(Leilao leilao) { em.getTransaction().begin(); em.remove(leilao); em.getTransaction().commit();
return leilao;
}
@Override public List<Leilao> listarTodos() { return em.createQuery("SELECT c FROM leiloes c").getResultList(); }
@Override public List<Leilao> listarTodosAtivos() { return em.createQuery("SELECT l FROM leiloes l WHERE status = 'Ativo'").getResultList();
}
@Override public List<Leilao> listarTodosInativos() { return em.createQuery("SELECT l FROM leiloes l WHERE status = 'Inativo'").getResultList(); }
}Classe Entity
/* * To change this template, choose Tools | Templates * and open the template in the editor. */
package br.pb.sistcomp.entity;
import java.io.Serializable;import java.util.Date;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.OneToOne;import javax.persistence.Table;import javax.persistence.Temporal;import javax.persistence.TemporalType;
/** * * @author jefferson *///Estou apenas testando@Entity@Table(name="leiloes")public class Leilao implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @OneToOne private Produto produto; @Column(nullable=true) private float lance_ini; @Column(nullable=true) private String status; @Temporal(TemporalType.TIME) private Date hora_criacao; @Temporal(TemporalType.DATE) private Date data_criaca; @Column(nullable=true) private Integer duracao; @Column private String descricao;
public Leilao(){
}
public Leilao(Produto produto, float lance_ini, String status, Date hora_criacao, Date data_criaca, Integer duracao, String descricao) { this.produto = produto; this.lance_ini = lance_ini; this.status = status; this.hora_criacao = hora_criacao; this.data_criaca = data_criaca; this.duracao = duracao; this.descricao = descricao; }
public String getDescricao() { return descricao; }
public void setDescricao(String descricao) { this.descricao = descricao; }
public Date getData_criaca() { return data_criaca; }
public void setData_criaca(Date data_criaca) { this.data_criaca = data_criaca; }
public Integer getDuracao() { return duracao; }
public void setDuracao(Integer duracao) { this.duracao = duracao; }
public Date getHora_criacao() { return hora_criacao; }
public void setHora_criacao(Date hora_criacao) { this.hora_criacao = hora_criacao; }
public float getLance_ini() { return lance_ini; }
public void setLance_ini(float lance_ini) { this.lance_ini = lance_ini; }
public Produto getProduto() { return produto; }
public void setProduto(Produto produto) { this.produto = produto; }
public String isStatus() { return status; }
public void setStatus(String status) { this.status = status; }
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
@Override public int hashCode() { int hash = 0; hash += (id != null ? id.hashCode() : 0); return hash; }
@Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set if (!(object instanceof Leilao)) { return false; } Leilao other = (Leilao) object; if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { return false; } return true; }
@Override public String toString() { return "Leilao{" + "Id = " + id + " Produto = " + produto + " Lance Inicial = " + lance_ini + " Status = " + status + " Hora criada = " + hora_criacao + " Data criada = " + data_criaca + " Duracao = " + duracao + " Descricao=" + descricao + '}'; }
}
Gostei + 0
29/04/2011
Jefferson Alves
E outra coisa,
Quando você diz que está bem configurado, você colocou o driver do banco na pasta lib do glassfish,entrou no console do Glassfish, configurou o datasource e fez um teste de ping né? Depois configurou o acesso via JNDI e testou o acesso direto? Consegue acessar o datasource diretamente via JNDI usando
context.lookup()
Está ok, esse mesmo banco utilizei com o servidor TOMCAT e funcionou blza. Dei o ping também é foi sucesso.
Não sei por que o glassfish está fazendo isso.
Gostei + 0
29/04/2011
Robson Teixeira
<jta-data-source></jta-data-source> pois ela que permitir o acesso via JNDI normalmente se persistir coloque a tag <non-jta-data-source/>
e outra coloque a tag provider e indique a classe que fará isso também no persistence.xml no caso classe no hibernate org.hibernate.ejb.HibernatePersistence
com isso sua aplicação não usar recursos JNDI e tambem quando vc usa JNDI e tenta criar o EntityManagerFactory ele da erro mesmo dizendo que não pode ser construido.
espero ter ajudado
att
robson
Gostei + 0
30/04/2011
Jefferson Alves
Olá a todos! Consegui resolver o problema e vcs foran muito útil, um amigo trocou o
javax.persistence.blbla que tinha nas tags property no meu primeiro persistence.xml e add hibernate.blabla
Com isso foi sanado os bugs! Obrigado a todos!!
Gostei + 0
30/04/2011
Davi Costa
Posta seu código para quem passar pelo mesmo problema, ver qual foi sua solução.
Att Davi
Gostei + 0
10/05/2011
Dyego Carmo
Se sim , por favor feche :)
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)