Hibernate

14 respostas
S

Boa tarde!

Estou estudando Hibernate e tentando persistir uma classe “Message” bem simples, uma exceção ocorre quando tento rodar.

vou colocar o codigo pra ficar mais fácil de visualizar, a exceção ta lá em baixo.

Esta é a classe Message

package hello;

public class Message 
{
    private long id;
    private String text;
    private Message nextMessage;
    
    
    Message(){}

    public Message(String text)
    {
        this.text = text;
    }
    
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Message getNextMessage() {
        return nextMessage;
    }

    public void setNextMessage(Message nextMessage) {
        this.nextMessage = nextMessage;
    }

 
    
    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
    
    
    
    
    
}

Criei um classe HibernateUtil

package persistence;


import org.hibernate.*;
import org.hibernate.cfg.*;


public class HibernateUtil 
{
    private static SessionFactory sessionFactory;

    static
    {
      try
        {
            sessionFactory = new Configuration().buildSessionFactory();
            
        }catch(Throwable ex)
         {
            throw new ExceptionInInitializerError(ex);
         }
    }


    public static SessionFactory getSessionFactory()
    {
        return sessionFactory;
    }

    
    public static void shutdown()
    {
        getSessionFactory().close();
    }
    
}

o meu mapeamente é esse

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--
    Document   : mapeteste.xml
  -->

<hibernate-mapping>
    <class
        name= "hello.Messsage"
        table= "MESSAGES">
            
            <id
                name="id"
                column="MESSAGE_ID">
                <generator class ="increment"/>
            </id>
            
            
            <property
                name="text"
                column="MESSAGE_TEXT"/>
                
            <many-to-one
                name="nextMessage"
                cascade="all"
                column="NEXT_MESSAGE_ID"
                foreign-key="FK_NEXT_MESSAGE"/>
                
    </class>
    
</hibernate-mapping>

Minha Classe que contém main

package hello;
import java.util.Iterator;
import java.util.List;
import org.hibernate.*;

import persistence.*; 



public class Hello 
{
    public static void main(String args[])
    {
        //primeira unidade
        Session session = 
                HibernateUtil.getSessionFactory().openSession();
        
        Transaction tx = session.beginTransaction();
        Message message = new Message("Hello Word");
        Long msdId = (Long) session.save(message);
        
        tx.commit();
        session.close();
        
        
        //segunda unidade
        Session newSession =
                HibernateUtil.getSessionFactory().openSession();
        
        Transaction newTransaction = newSession.beginTransaction();
        
        List messages =
                newSession.createQuery("from Message m order by m.text asc").list();
        
        System.out.println(messages.size() + "messages found: ");
        
        for(Iterator iter = messages.iterator(); iter.hasNext();)
        {
            Message loadedMsg = (Message) iter.next();
            System.out.println(loadedMsg.getText());
        }
        
        newTransaction.commit();
        HibernateUtil.shutdown();
    }

}

e meu arquivo de configuração do hibernate

<!DOCTYPE hibernate-configuration SYSTEM
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!--
    Document   : hibernate.cfg.xml
  -->


<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">
            jdbc:mysql://localhost
        </property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">2050</property>
        
        
        <property name="hibernate.dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        
    <-Conection pool c3p0->
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.timeout">300</property>
        <property name="hibernate.c3p0.max_statements">50</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        
    
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>

        <mapping resource="hello/Message.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

A exceção é esta:

Exception in thread "main" java.lang.ExceptionInInitializerError
        at persistence.HibernateUtil.<clinit>(HibernateUtil.java:29)
        at hello.Hello.main(Hello.java:22)
Caused by: java.lang.NoClassDefFoundError: org/dom4j/DocumentException
        at persistence.HibernateUtil.<clinit>(HibernateUtil.java:25)
        ... 1 more
Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        ... 2 more
Java Result: 1

Se alguem tiver alguma dica agradeço desde já!
to usando o Netbeans.

abraço

14 Respostas

T

parece estar faltando o jar:

dom4j-1.6.1.jar

tente adicionar ao projeto,

até mais.

S

Estranho pois dom4j-1.6.1 esta dentro do pacote Hibernate que importei pra minhas “Bibliotecas”.

S

Será esta ocorrendo este erro pelo fato de eu não ter criado as tabelas no Banco ainda?!

bruno_savi

pode ser crie as tabelas para dar uma analisada, caso não seja isso alguma lib esta com problema…,
outra coisa utilize annotations é mais simples :slight_smile:

S

adicionei todas as jar necessarias no projeto novamente, inclusive dom4j-1.6.1.

mas agora outra ecessão acontece

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" java.lang.ExceptionInInitializerError
        at persistence.HibernateUtil.<clinit>(HibernateUtil.java:29)
        at hello.Hello.main(Hello.java:22)
Caused by: java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
        at org.slf4j.LoggerFactory.<clinit>(LoggerFactory.java:60)
        at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:128)
        at persistence.HibernateUtil.<clinit>(HibernateUtil.java:25)
        ... 1 more
Caused by: java.lang.ClassNotFoundException: org.slf4j.impl.StaticLoggerBinder
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        ... 4 more
Java Result: 1

adicionei a clase slf4j, mas SticLoggerBinder não esta sendo carregado
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.

será que é a cglib.jar? vou tentar adiciona-lá!!

S

Boa tarde pessoal.

Adicionei as jar’s que estavam em falta, tenho um outra Exception.

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" java.lang.ExceptionInInitializerError
        at persistence.HibernateUtil.<clinit>(HibernateUtil.java:30)
        at hello.Hello.main(Hello.java:25)
Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from resource hello/Message.hbm.xml
        at org.hibernate.cfg.Configuration.addResource(Configuration.java:575)
        at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1593)
        at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1561)
        at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1540)
        at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1514)
        at org.hibernate.cfg.Configuration.configure(Configuration.java:1434)
        at org.hibernate.cfg.Configuration.configure(Configuration.java:1420)
        at persistence.HibernateUtil.<clinit>(HibernateUtil.java:26)
        ... 1 more
Caused by: org.hibernate.MappingException: class hello.Messsage not found while looking for property: id
        at org.hibernate.util.ReflectHelper.reflectedPropertyClass(ReflectHelper.java:74)
        at org.hibernate.mapping.SimpleValue.setTypeUsingReflection(SimpleValue.java:279)
        at org.hibernate.cfg.HbmBinder.bindSimpleId(HbmBinder.java:401)
        at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:334)
        at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:273)
        at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:144)
        at org.hibernate.cfg.Configuration.add(Configuration.java:675)
        at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:510)
        at org.hibernate.cfg.Configuration.addResource(Configuration.java:572)
        ... 8 more
Caused by: java.lang.ClassNotFoundException: hello.Messsage
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
        at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:100)
        at org.hibernate.util.ReflectHelper.reflectedPropertyClass(ReflectHelper.java:70)
        ... 16 more
Java Result: 1

Alguem pode me dar uma dica?

Li que o Hibernate também gera as tabelas no banco, se configurado para isso.
Como posso fazer isso?

Agradeço desde já!

S

encontrei o erro que estava gerando todas essas Exceptions.

no mapeamento

<hibernate-mapping>
    <class
        name= "hello.Message"   (O ERRO)
        table= "MESSAGES">

Message estava com três “s”

agora vou tentar gerar as tabelas no banco usando o SchemaExport.

S

Bom pessoal, Problema Resolvido!

Já estou fazendo inserções, ta tudo funcionando corretamente!

Os passos finais foram:

Adicionei jpa.jar ao projeto. Estava lançando uma Exception.

Alterei a URL de conecção com banco ficando assim:

<property name="hibernate.connection.url">jdbc:mysql://localhost/NOME_BASE_DADOS</property>

e gerei o esquema do banco na classe Principal utilizando SchemaExport:

Configuration cfg = new Configuration().configure();
        
        SchemaExport schemaExport = new SchemaExport(cfg);
        schemaExport.create(true, true);

Vou estudar concorrência utilizando hibernate, logo postarei a solução completa do problema!

Obrigado à todos.

D

Esse exemplo é o do livro Java Persistence com Hibernate?

Dayse Rocha.

S

sim, utilizei este livro pra aprender os conceitos do Hibernate.

D

Cara, estou tentando executar, mas estou encontrando muitos erros, acho que é quanto as libs, vc pode me passar a lista de libs necessárias acompanhadas de suas respectivas versões para que esse exemplo rode? Já tentei de tudo e nada!

D

Acho que consegui superar o problema com as libs, mas agora estou com o seguinte problema:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).

log4j:WARN Please initialize the log4j system properly.

Hibernate:

select

max(MESSAGE_ID)

from

MESSAGES

Exception in thread main org.hibernate.exception.SQLGrammarException: could not fetch initial value for increment generator

at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)

at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)

at org.hibernate.id.IncrementGenerator.getNext(IncrementGenerator.java:107)

at org.hibernate.id.IncrementGenerator.generate(IncrementGenerator.java:44)

at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:98)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)

at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)

at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)

at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)

at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)

at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)

at hello.HelloWorld.main(HelloWorld.java:18)

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table firsthibernate.messages doesnt exist

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)

at java.lang.reflect.Constructor.newInstance(Unknown Source)

at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)

at com.mysql.jdbc.Util.getInstance(Util.java:381)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)

at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885)

at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)

at org.hibernate.id.IncrementGenerator.getNext(IncrementGenerator.java:85)

 11 more

Por favor, ajude-me. Acho que está faltando eu criar a tabela, mas no livro não há o esquema, isso é gerado automaticamente?

D

Consegui fazer rodar o primeiro projeto de hibernate!

Obrigada!

Obs.: Se eu precisar novamente de ajuda, retornarei!

S

fique à vontade para perguntar!

existem duas formas de fazer com que o hibernate mapeie tuas entidades e gere o esquema.

Programaticamente:

Configuration cfg = new Configuration().configure();
         SchemaUpdate schema = new SchemaUpdate(cfg);
         schema.execute(false,true);

outra solução é colocar um property no seu arquivo de configuração “hibernate.cfg.xml” desta forma.

update

O hibernate já cuida de quase tudo para você quanto a criação.

[Edits] Varias edições para correção ortográfica. é como dizem “Quem faz com pressa faz duas, três (…) vezes”

Criado 11 de julho de 2008
Ultima resposta 9 de set. de 2008
Respostas 14
Participantes 4