Não consigo persistir dados com hibernate

11 respostas
T

Boa noite sou novo com hibernate e nao consigo persistir os dados quando compilo uma classe teste. da o seguinte erro

0 [main] INFO  org.hibernate.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {4.0.1.Final}
9 [main] INFO  org.hibernate.Version - HHH000412: Hibernate Core {4.1.0.Final}
14 [main] INFO  org.hibernate.cfg.Environment - HHH000206: hibernate.properties not found
18 [main] INFO  org.hibernate.cfg.Environment - HHH000021: Bytecode provider name : javassist
58 [main] INFO  org.hibernate.ejb.Ejb3Configuration - HHH000318: Could not find any META-INF/persistence.xml file in the classpath
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named fj21
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:69)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
	at br.com.exercicios.teste.TestaInsereProduto.main(TestaInsereProduto.java:14)

Minha classe Produto

package br.com.exercicios.entities;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Produto {
@Id
@GeneratedValue
int id;
String nome;
double preco;

public int getId() {
return id;
}
private void setId(int id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public double getPreco() {
return preco;
}
public void setPreco(double preco) {
this.preco = preco;
}
}

Classe Testa

package br.com.exercicios.teste;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import br.com.exercicios.entities.Produto;

public class TestaInsereProduto {

public static void main(String[] args) {

EntityManagerFactory factory =
   Persistence.createEntityManagerFactory("fj21");
EntityManager em = factory.createEntityManager();

Produto p = new Produto();
p.setNome("camiseta");
p.setPreco(12.23);

em.getTransaction().begin();

em.persist(p);

em.getTransaction().commit();

em.close();
}
}

eo persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
 
<persistence-unit name="fj21">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>entities.Produto</class>
<properties>
<property name="hibernate.dialect"
    value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />

<property name="javax.persistence.jdbc.driver"
    value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url"
    value="jdbc:mysql://localhost/fj21" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="titata" />
</properties>
</persistence-unit>
</persistence>

obrigado

11 Respostas

K

Olha também sou um tanto iniciante em hibernate.

Na minha opinião vc deveria ter utilizado na declaração da classe a anotação @Table(name="") onde “name” é o nome da tabela.

outra coisa que não vi foi a declaração das colunas utilizando a anotação @Column pois é através dela que o hibernate vai relacionar os campos do seu bean com as colunas da tabela no banco de dados.

A anotação @GeneratedValue precisa de que sejam definidos dois parâmetros o “generator” e o “strategy” que devem ser definidos para que o hibernate possa gerar o identificador do registro, e dependendo da estratégia utilizada(parâmetro ‘strategy’) você vai ter de definir um “generator” especifico tipo para a estratégia GenerationType.SEQUENCE você vai ter de definir um generator com a anotação @SequenceGenerator e especificar o parâmetro “name” e “sequenceName” e para este caso recomendo definir também o “allocationSize” para 1 porque senão toda vez que você montar uma SessionFactory ele vai alocar um espaço padrão de 50 números na sequência que gera seus identificadores podendo deixar um vácuo nos identificadores e fazendo com que você não use todos os números da sequência.

Daí então sua classe ficaria assim.

@Entity  
public class Produto {  
@Id  
@GeneratedValue(generator="gen_produto",strategy=GenerationType.SEQUENCE)
// Se tiver vários esquemas pode também qualificar a sequência com o esquema assim "esquema.sq_produto"
@SequenceGenerator(name="gen_produto",allocationSize=1,sequenceName="sq_produto") 
                                       
@Column(name="id") // id também precisa por que também é uma coluna da tabela.
int id;  
@Column(name="nome")
String nome;  
@Column(name="preco")
double preco; 

// Getters e Setters abaixo.

Qualquer coisa vc pode usar o NetBeans para gerar todo este código.

Na versão 6.8 do net beans você clica com o botão esquerdo em cima do pacote que vai receber as classes=> vai em novo => Persistence => Classe entidade do banco de dados.

Agora se você quer que estes beans sejam portáveis para outros bancos de dados com mesmo esquema não marque a opção “Nomes de tabela de banco de dados totalmente qualificados”.

Daí você segue o assistente e pronto.
Desculpe se foi muito longo na explicação e eu espero ter ajudado. :slight_smile:

Elizeu_Santos

tbm sou noso com hibernate… o persistence.xml ta no local correto?

fabiomedeirosf

Olá, não querendo fazer propoganda, mas já fazendo rsrs

TEnho mantido um blog (tentado ao menos rs), abordei alguns posts sobre JPA com hibernate, estão bem passo a passo. Dê uma visitada por lá, talvez possa ajudar: www.serjava.blogspot.com.

rmendes08

O erro tá bem na cara:

Could not find any META-INF/persistence.xml file in the classpath

O persistence.xml tem que ficar na pasta src/META-INF

T

meu persistence.xml está dentro da pasta META-INF como disse, mas mesmo assim da este erro

rmendes08

titata:

meu persistence.xml está dentro da pasta META-INF como disse, mas mesmo assim da este erro

sim, mas em qual pasta está a pasta META-INF ? além disso, está sendo feito o deploy do arquivo ? ele está indo para o .jar/.war ? pois o erro é esse.

T

rmendes08:
titata:

meu persistence.xml está dentro da pasta META-INF como disse, mas mesmo assim da este erro

…além disso, está sendo feito o deploy do arquivo ? ele está indo para o .jar/.war ? pois o erro é esse.

ai vc falou grego pro iniciante aki rs… mas o caminho aki está WebContent/META-INF/persistence.xml

rmendes08

você está usando o Eclipse ? coloque uma cópia do META-INF na pasta src.

T

to sim… deu certo, nao pode haver esta pasta Webcontent no meio delas 1 erro resolvido mas 3.454.236 a mais gerados agora heheeh

0 [main] INFO org.hibernate.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {4.0.1.Final} 10 [main] INFO org.hibernate.Version - HHH000412: Hibernate Core {4.1.0.Final} 13 [main] INFO org.hibernate.cfg.Environment - HHH000206: hibernate.properties not found 15 [main] INFO org.hibernate.cfg.Environment - HHH000021: Bytecode provider name : javassist Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: fj21] class or package not found at org.hibernate.ejb.Ejb3Configuration.addNamedAnnotatedClasses(Ejb3Configuration.java:1400) at org.hibernate.ejb.Ejb3Configuration.addClassesToSessionFactory(Ejb3Configuration.java:1183) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1047) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:290) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:372) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:55) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) at br.com.exercicios.teste.TestaInsereProduto.main(TestaInsereProduto.java:14) Caused by: java.lang.ClassNotFoundException: entities.Produto at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at org.hibernate.internal.util.ReflectHelper.classForName(ReflectHelper.java:170) at org.hibernate.ejb.Ejb3Configuration.classForName(Ejb3Configuration.java:1317) at org.hibernate.ejb.Ejb3Configuration.addNamedAnnotatedClasses(Ejb3Configuration.java:1389) ... 8 more

rmendes08

Para mapear a classe você precisa colocar o nome completo dela na tag :

<class>br.com.exercicios.entities.Produto</class>
T

ai sim meu fiii agora deu certo tdo vlw show de bola… vcs acabam de ganhar um tijolinho no céu hehe

Criado 14 de março de 2012
Ultima resposta 14 de mar. de 2012
Respostas 11
Participantes 5