2012-04-02 8 views
12

Ho una classe molto semplice:Hibernate entità sconosciuta (non manca @Entity o importare javax.persistence.Entity)

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name = "users") 
public class User { 

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

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

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

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


    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
    public String getEmail() { 
     return email; 
    } 
    public void setEmail(String email) { 
     this.email = email; 
    } 
    public long getId() { 
     return id; 
    } 
    public void setId(long id) { 
     this.id = id; 
    } 
} 

Io lo chiamo con questo principale:

public class Main { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     HibernateUtil.buildSessionFactory(); 
     Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
     session.beginTransaction(); 
     User u = new User(); 
     u.setEmail("[email protected]"); 
     u.setFirstName("David"); 
     u.setLastName("Gray"); 

     session.save(u); 
     session.getTransaction().commit(); 
     System.out.println("Record committed"); 
     session.close(); 


    } 

} 

I continuo a ricevere questo MappingException:

Exception in thread "main" org.hibernate.MappingException: Unknown entity: org.assessme.com.entity.User 
    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1172) 
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1316) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:204) 
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:189) 
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:670) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:662) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:658) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352) 
    at $Proxy4.save(Unknown Source) 
    at Main.main(Main.java:20) 

mio HibernateUtil è:

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.service.ServiceRegistry; 
import org.hibernate.service.ServiceRegistryBuilder; 

public class HibernateUtil { 

    private static SessionFactory sessionFactory; 
    private static ServiceRegistry serviceRegistry; 

    public static SessionFactory buildSessionFactory() { 
     try { 
      // Create the SessionFactory from hibernate.cfg.xml 
      Configuration configuration = new Configuration(); 
      configuration.configure(); 
      serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();  
      return new Configuration().configure().buildSessionFactory(serviceRegistry); 
     } catch (Throwable ex) { 
      // Make sure you log the exception, as it might be swallowed 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     sessionFactory = new Configuration().configure().buildSessionFactory(serviceRegistry); 
     return sessionFactory; 
    } 

} 

Qualcuno ha qualche idea come ho visto tanti duplicati ma le risoluzioni non sembrano funzionare per me. Questo è il mio hibernate.cfg.xml:

<?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> 
     <!-- Database connection settings --> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://localhost/ssme</property> 
     <property name="connection.username">root</property> 
     <property name="connection.password">mypassword</property> 

     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">1</property> 

     <!-- SQL dialect --> 
     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

     <!-- Enable Hibernate's automatic session context management --> 
     <property name="current_session_context_class">thread</property> 

     <!-- Disable the second-level cache --> 
     <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

     <!-- Echo all executed SQL to stdout --> 
     <property name="show_sql">true</property> 

     <!-- Drop and re-create the database schema on startup --> 
     <property name="hbm2ddl.auto">update</property> 

    </session-factory> 
</hibernate-configuration> 

risposta

10

Si consiglia di utilizzare AnnotationConfiguration invece di Configuration e quindi chiamare

configuration.addAnnotatedClass(User.class); 

per aggiungere la classe per l'elenco delle classi mappate.

+0

Ah, devo fare questo nella mia HibernateUtil, è buona norma farlo tutto in una classe diresti? – david99world

+0

Dipende dalle dimensioni del tuo progetto. Se hai solo un paio di classi mappate puoi farlo nel tuo 'HibernateUtil'. Per i progetti più grandi, ad es. utilizzare la reflection per aggiungere tutte le classi di un pacchetto specifico alla modalità di sospensione, oppure è possibile utilizzare un file di configurazione del mapping. – phlogratos

2

Avete qualche persistence.xml o hibernate.cfg.xml. Se è necessario aggiungere la classe di mappatura in modo tale da far capire che la classe sta mappando sul database. Se si dispone di hibernate.cfg.xml è possibile aggiungere come questo <mapping class="com.entity.Users"/>

10

Aggiungi al hibernate.cfg.xml prima </session-factory> questo:

<mapping class="org.assessme.com.entity.User" /> 
3

considerare l'utilizzo di AnnotationConfiguration descritto here.

È possibile utilizzare il metodo addClass(User.class) oppure se si utilizzano più entità con il metodo addPackage("org.assessme.com.entity").

Sei tipo di reinventare la ruota con questa classe HibernateUtil. Prendi in considerazione l'utilizzo di Spring in modo da poter sfruttare qualcosa come il suo AnnotationSessionFactoryBean.

1

Ho dimenticato di aggiungere il mapping hbm.xml nel mio file cfg.xml. Non appena l'ho aggiunto, questa eccezione è scomparsa.

<mapping resource="com/mycompany/backend/hibernate/CServiceCenters.hbm.xml" /> 
1

Aggiungi sotto riga al hibernate.cfg.xml

<mapping class="fully qualified Entity class name"/> 
Problemi correlati