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?