[RESOLVIDO] Problemas com Persistência de relacionamento OneToMany

Bom Dia Amigos do Fórum,

Comecei a utilizar o Hibernate agora… e estou fazendo alguns testes … quando fui testar o relacionamento 1-N com ele… me deparei com um problema que não estou conseguindo resolver… já fiz algumas pesquisas na internet… mais nada q pudesse me levar a solucionar o problema…

Vamos lá:

O trace do erro é este:

INFO: Not binding factory to JNDI, no JNDI name configured
Exception in thread "main" org.hibernate.MappingException: Unknown entity: model.Universidade
        at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:693)
        at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1485)
        at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:120)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
        at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
        at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
        at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697)
        at Crud.main(Crud.java:99)
Java Result: 1

Meu hibernate.cfg.xml está assim:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
   <session-factory>
      <!-- properties -->
      <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
      <property name="connection.url">jdbc:mysql://localhost:3306/escola</property>
      <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
      <property name="show_sql">true</property>
      <property name="connection.username">root</property>
      <property name="connection.password">admin</property>
      <property name="connection.pool_size">10</property>

      <!-- Mapeamento das Classes -->
      <mapping class="model.Centro"/>
      <mapping class="model.Universidade"/>
   </session-factory>
</hibernate-configuration>

Minhas classes estão respectivamente assim:

Universidade

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model;

import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

/**
 *
 * @author Markos
 */
@Entity
@Table(name="universidade")
public class Universidade {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id_universidade")
    private int id;

    @Column(name="nome")
    private String nome;

    @OneToMany(mappedBy="universidade", fetch=FetchType.LAZY)
    @Cascade(CascadeType.ALL)
    private Collection<Centro> centros;

    public Universidade(){
    }

    public Collection<Centro> getCentros() {
        return centros;
    }

    public void setCentros(Collection<Centro> centros) {
        this.centros = centros;
    }

    public int getId() {
        return id;
    }

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

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
}

Centro

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

/**
 *
 * @author Markos
 */
@Entity
@Table(name="centro")
public class Centro {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id_centro")
    private int id;

    @Column(name="nome")
    private String nome;

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="id_universidade", insertable=true, updatable=true)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    private Universidade universidade;

    public Centro(){
    }

    public int getId() {
        return id;
    }

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

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Universidade getUniversidade() {
        return universidade;
    }

    public void setUniversidade(Universidade universidade) {
        this.universidade = universidade;
    }
}

A classe principal que está manipulando os objetos esta assim:

import java.util.HashSet;
import javax.swing.JOptionPane;
import model.Centro;
import model.Universidade;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author desenv2
 */
public class Crud {

    public static void main(String args[]) {
        // Objeto que contém as configurações do hibernate
        Configuration cfg = new AnnotationConfiguration();

        // Configura o objeto com o conteúdo do hibernate.cfg.xml
        cfg.configure("/conf/hibernate.cfg.xml");

        // Instância uma SessionFactory
        SessionFactory sf = cfg.buildSessionFactory();

        // Abre uma sessão com o Hibernate
        Session session = sf.openSession();

        // Cria uma transação
        Transaction tx = session.beginTransaction();

        Universidade univ = new Universidade();

        univ.setNome("Universidade Federal de Minas Gerais");

        Centro centro1 = new Centro();

        centro1.setNome("Centro de Tecnologia");
        centro1.setUniversidade(univ);

        Centro centro2 = new Centro();

        centro2.setNome("Centro de Humanas");
        centro2.setUniversidade(univ);

        Collection<Centro> centros = new HashSet<Centro>();
        centros.add(centro1);
        centros.add(centro2);

        univ.setCentros(centros);

        session.save(univ);

        session.close();        
    }
}

Eu já realizei um teste de inserção simples com outra classe e funcionou perfeitamente…
Alguém teria alguma idéia do que pode estar acontecendo???
Estou utilizando o banco de dados MySQL…

Desde já agradeço pelo ajuda…

Olá pinguin-suni
Cara pelo que me parece, o erro está no seu mapeamento no arquivo xml.

Aqui você pode consultar a documentação e ver direitinho como faz o mapeamento.

Entendi…

Vou dar uma olhadinha…

Mas oq eu axei estranho… é que minha tabela tem apenas 2 campos, id_universidade e nome … eu removi todos os demais mapeamentos e mesmo assim não adiantou…

Vou tentar procurar na documentação para ver se eu encontro alguma luz…

Vlw

:smiley:

cara eu acho que ta certo, vc usa o netbeans ?? se sim da um limpar e construir e tenta executar de novo, nesse erro parece que ele não está encontrando a classe Universidade

Isso mesmo…

Uso o netbeans…

Vou tentar fazer oq vc sugeriu…

Vlw…

Cara,

Fiz o que você sugeriu… e aparentemente funcionou…

Porém agora o trace mudou para:

INFO: Bind entity model.Universidade on table universidade
Exception in thread "main" java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
        at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1912)
        at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:796)
        at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707)
        at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:4035)
        at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3989)
        at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1398)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1856)
        at Crud.main(Crud.java:32)
Java Result: 1

Pelo que pesquisei na net descobri que poderia ser a falta do .jar ejb3-persistence…

Entretanto o referido arquivo esta em meu projeto…

Alguma sugestão?

Obrigado !!!

:idea:

Após várias tentativas e googladas…

Encontrei a solução do meu problema…

Removi o arquivo ejb3-persistence.jar do meu classpath e VUALA !!!

Problema resolvido…

Agradeço pela ajuda de todos…

estava com o mesmo problema… removi a lib q tu falou e deu certo… valeu :wink:

otima dica ! estava com o mesmo problema e apagando a lib o problema sumiu