2012-04-02 127 views
12

我有一个非常简单的类:休眠未知实体(不缺少@Entity或进口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; 
    } 
} 

我把它用这个主:

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(); 


    } 

} 

我不断收到此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) 

我的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; 
    } 

} 

有没有人有任何想法,因为我看了这么多重复,但决议似乎没有为我工作。这是我的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> 

回答

10

您应该使用AnnotationConfiguration代替Configuration,然后调用

configuration.addAnnotatedClass(User.class); 

你的类添加到映射类的列表。

+0

啊,我应该这样做在我的HibernateUtil,是它做的是所有在一个类中,你会说最好的做法? – david99world 2012-04-02 17:19:15

+0

取决于您的项目大小。如果你只有几个映射类,你可以在'HibernateUtil'中完成。对于较大的项目,您可以使用反射将特定包的所有类添加到休眠中,或者可以使用映射配置文件。 – phlogratos 2012-04-02 17:28:48

2

你有没有任何persistence.xml或hibernate.cfg.xml。如果你必须添加你的映射类,那么hibernate会理解你的类映射到数据库。如果你有hibernate.cfg.xml中,您可以添加这样 <mapping class="com.entity.Users"/>

10

添加到hibernate.cfg.xml</session-factory>在此之前:

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

考虑使用AnnotationConfiguration描述here

您可以使用它的addClass(User.class)方法,或者如果您坚持多个实体使用addPackage("org.assessme.com.entity")方法。

你是这种HibernateUtil类重新发明车轮。考虑使用Spring,这样你就可以利用像AnnotationSessionFactoryBean这样的东西。

1

我忘了将hbm.xml映射添加到我的cfg.xml文件中。一旦我添加它,这个例外就消失了。

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

添加下面一行到你的hibernate.cfg.xml

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