我是学习Hibernate4并且在尝试XML hibernate映射时遇到了这个问题。
我正在使用eclipse和MySQL。
尝试在DB表中插入对象时出错: org.hibernate.MappingException:未知实体: com.hibernate.gestionproductos.modelo.Proveedores
hibernate.cfg.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="sfBDHibernate">
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/bdhibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
<mapping class="com.hibernate.gestionproductos.modelo.Proveedores"/>
</session-factory>
</hibernate-configuration>
您可以看到Proveedores类被映射。
ProveedoresDAO.java:
package com.hibernate.gestionproductos.dao;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import com.hibernate.gestionproductos.modelo.Proveedores;
public class ProveedoresDAO {
private SessionFactory getSessionFactory() {
configure hay que ponerle el path
Configuration configuracion = new Configuration().configure();
// HIBERNATE 4
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
.applySettings(configuracion.getProperties());
SessionFactory sf = configuracion.buildSessionFactory(builder.build());
return sf;
}
public void insertarProveedor(Proveedores prov) {
try {
SessionFactory sf = getSessionFactory();
Session sesion = sf.openSession();
org.hibernate.Transaction tx = sesion.beginTransaction();
sesion.save(prov);
tx.commit();
sesion.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public List<Proveedores> listarProveedores() {
try {
SessionFactory sf = getSessionFactory();
Session sesion = sf.openSession();
org.hibernate.Transaction tx = sesion.beginTransaction();
List<Proveedores> lista = sesion.createCriteria(Proveedores.class).list();
tx.commit();
sesion.close();
return lista;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
Proveedores.java:
package com.hibernate.gestionproductos.modelo;
public class Proveedores implements java.io.Serializable {
private Long idproveedores;
private String nombre;
private String contacto;
private String email;
private String telefono;
public Proveedores() {
}
public Proveedores(String nombre, String email) {
this.nombre = nombre;
this.email = email;
}
public Proveedores(String nombre, String contacto, String email, String telefono) {
this.nombre = nombre;
this.contacto = contacto;
this.email = email;
this.telefono = telefono;
}
public Long getIdproveedores() {
return this.idproveedores;
}
public void setIdproveedores(Long idproveedores) {
this.idproveedores = idproveedores;
}
public String getNombre() {
return this.nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getContacto() {
return this.contacto;
}
public void setContacto(String contacto) {
this.contacto = contacto;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTelefono() {
return this.telefono;
}
public void setTelefono(String telefono) {
this.telefono = telefono;
}
}
Proveedores.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.hibernate.gestionproductos.modelo.Proveedores" table="proveedores" catalog="bdhibernate">
<id name="idproveedores" type="java.lang.Long">
<column name="idproveedores" />
<generator class="identity" />
</id>
<property name="nombre" type="string">
<column name="nombre" length="45" not-null="true" />
</property>
<property name="contacto" type="string">
<column name="contacto" length="45" />
</property>
<property name="email" type="string">
<column name="email" length="100" not-null="true" />
</property>
<property name="telefono" type="string">
<column name="telefono" length="12" />
</property>
</class>
</hibernate-mapping>
ConfiguracionXML.java:
package com.hibernate.gestionproductos.programa;
import java.util.List;
import com.hibernate.gestionproductos.dao.ProveedoresDAO;
import com.hibernate.gestionproductos.modelo.Proveedores;
public class ConfiguracionXML {
public static void main(String[] args) {
Proveedores prov = new Proveedores();
prov.setNombre("Proveedor 3");
prov.setContacto("Juan");
prov.setEmail("juan@proveedor3.com");
prov.setTelefono("632227612");
ProveedoresDAO dao = new ProveedoresDAO();
dao.insertarProveedor(prov);
System.out.println("Se ha insertado el proveedor");
List<Proveedores> proveedores = dao.listarProveedores();
System.out.println("Listado de Proveedores:\n");
for (Proveedores p : proveedores) {
System.out.println(p.getIdproveedores() + " - " + p.getNombre());
}
}
}
这里在dao.insertarProveedor(prov)中断了:
org.hibernate.MappingException:未知实体: com.hibernate.gestionproductos.modelo.Proveedores Se ha insertado el 证明者 org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776) 在 org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1451) .....
任何人都可以提供帮助吗?
答案 0 :(得分:0)
问题在于您提到的Hibernate.cfg.xml
<mapping class="com.hibernate.gestionproductos.modelo.Proveedores"/>
这告诉Hibernate系统将此类作为实体读取,但类本身没有任何此类信息。使用注释描述实体时,将使用上述配置(或映射标记的类属性)。如果您使用hbm XML提供有关您的实体的信息,请按以下方式使用映射标记的资源属性 -
<mapping resource="Proveedores.hbm.xml"/>
因此,在hbm xml doc中替换此行将使Hibernate读取您提供的映射定义。由于您现在没有指定它,因此您没有读取映射信息,因此Hibernate不知道该实体导致未知实体。