Problemas com SessionFactory no Hibernate

2 respostas
trx64

Estou tentando mapear a seguinte classe no Hibernate:

package getSet;
 
public class Empresa {

    private int idEmpresa;
    private String razaosocial;
    private String nomeComercial;
    private String cnpj;
    private String inscricaoEstadual;
    private Endereco endereco;
    private Empresa mEmpresa;

Obs.: omiti os métodos get/set para economizar espaço aqui.

O mapeamento que fiz é esse:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="getSet.Empresa" table="empresa">
    <id name="idEmpresa" column="id_empresa" type="int">
        <generator class="sequence">
            <param name="sequence">empresa_seq</param>
        </generator>
    </id>
  
  <many-to-one name="endereco" column="id_endereco" class="getSet.Endereco" property-ref="idEndereco"/>
  
  <property name="empresa" column="empresa"/>
  <property name="razaosocial" column="razaosocial"/>
  <property name="nomeComercial" column="nomecomercial"/>
  <property name="cnpj" column="cnpj"/>
  <property name="inscricaoEstadual" column="inscricaoestadual"/>

  
  <many-to-one name="mEmpresa" column="filial" class="getSet.Empresa" property-ref="idEmpresa"/>
  </class>

</hibernate-mapping>

Além das propriedades, existem duas relações muitos para um no banco.

O banco de dados em questão é o Postgres, esse é o hibernate.cfg.xml, que está na raiz do projeto:

<?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>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/repmarine</property>
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.connection.password">postgres</property>
    <mapping class="getSet.Empresa" file="" jar="" package="getSet" resource="getSet/Empresa.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

O código que fiz para salvar a empresa no banco, com um método Main para teste (omiti os imports. A classe implementa uma interface, apenas para padronizar as operações):

public class ManterEmpresa implements Manter {

    //private SessionFactory fac;

    public ManterEmpresa()
    {
    }

    public void inserir(Object obj, Connection conn) {
        try{
            Empresa emp = (Empresa) obj;

            SessionFactory fac = new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory();

            Session session = fac.openSession();
            Transaction tx = session.beginTransaction();

            session.save(emp);
            tx.commit();

            session.close();

        } catch (HibernateException ex) {
            System.out.println("Falha ao inserir registro.\n" + ex);
        }
    }

    public void remover(Object obj, Connection conn) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void alterar(Object obj, Connection conn) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void consultar(Object obj, Connection conn) {
        throw new UnsupportedOperationException("Not supported yet.");
    }


    public static void main(String[] args)
    {
        Empresa filial = new Empresa();
        filial.setIdEmpresa(2);

        Endereco end = new Endereco();
        end.setIdEndereco(1);

        Empresa emp = new Empresa();
        emp.setCnpj("111111");
        emp.setEmpresa(filial);
        emp.setInscricaoEstadual("1111111");
        emp.setNomeComercial("teste");
        emp.setRazaosocial("teste2");
        emp.setEndereco(end);

        Connection conn = null;

        ManterEmpresa me = new ManterEmpresa();

        me.inserir(emp, conn);
    }
}

A saída da execução do programa é:

run:
28/03/2010 14:01:39 org.hibernate.cfg.Environment <clinit>
INFO: Hibernate 3.2.5
28/03/2010 14:01:39 org.hibernate.cfg.Environment <clinit>
INFO: hibernate.properties not found
28/03/2010 14:01:39 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: Bytecode provider name : cglib
28/03/2010 14:01:39 org.hibernate.cfg.Environment <clinit>
INFO: using JDK 1.4 java.sql.Timestamp handling
28/03/2010 14:01:39 org.hibernate.cfg.Configuration configure
INFO: configuring from resource: /hibernate.cfg.xml
28/03/2010 14:01:39 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: Configuration resource: /hibernate.cfg.xml
28/03/2010 14:01:39 org.hibernate.cfg.Configuration addResource
INFO: Reading mappings from resource : getSet/Empresa.hbm.xml
28/03/2010 14:01:39 org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: getSet.Empresa -> empresa
28/03/2010 14:01:39 org.hibernate.cfg.Configuration doConfigure
INFO: Configured SessionFactory: null
Exception in thread "main" java.lang.NullPointerException
        at org.hibernate.mapping.ManyToOne.createPropertyRefConstraints(ManyToOne.java:47)
        at org.hibernate.cfg.HbmBinder$ManyToOneSecondPass.doSecondPass(HbmBinder.java:2717)
        at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1286)
        at AcessoDados.ManterEmpresa.inserir(ManterEmpresa.java:52)
        at AcessoDados.ManterEmpresa.main(ManterEmpresa.java:101)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)

Bem, alguém sabe o que está errado no código acima? Como posso solucionar esse problema?

2 Respostas

rogelgarcia

Nossa agora complicou…

É dureza quando dá esses paus no hibernate…as vezes é até alguma coisa boba… tem que analizar tudo pra ver se nao tem algum detalhe errado…

Pq pelo nullpointer nao dá nem pra saber o que é

Leozin

O teu one-to-many parece estar errado.

Faz o seguinte, no “property-ref”, coloque a propriedade no outro objeto que referencia a empresa

Por exemplo, se na empresa tem isso:

na classe Endereco, você deve ter isso:

e colocar um one-to-many no mapeamento da classe Empresa

Criado 28 de março de 2010
Ultima resposta 29 de mar. de 2010
Respostas 2
Participantes 3