2015-10-08 160 views
1

下面的代碼只是正常工作與Hibernate 4.3,但是當我嘗試使用Hibernate 5.0這將導致以下錯誤同樣的代碼:休眠5:org.hibernate.MappingException:未知實體

Exception in thread "main" org.hibernate.MappingException: Unknown entity: entity.Message 
    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776) 
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1451) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:100) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) 
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) 
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) 
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:678) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:670) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:665) 
    at client.Main.main(Main.java:14) 

有人能幫助我理解爲什麼會發生?


以下是被用於測試示例的代碼:

Main.java

package client; 
import org.hibernate.Session; 
import util.HibernateUtil; 
import entity.Message; 

public class Main { 
    public static void main(String[] args) {   
     Session session = HibernateUtil.getSessionFactory().openSession(); 
     session.beginTransaction(); 

     Message message = new Message("Hello Hibernate 5"); 

     session.save(message);  

     session.getTransaction().commit(); 
     session.close();  
    } 
} 

HibernateUtil.java

package util; 
import org.hibernate.SessionFactory; 
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 
import org.hibernate.cfg.Configuration; 

public class HibernateUtil {  
    private static final SessionFactory sessionFactory = buildSessionFactory();  
    private static SessionFactory buildSessionFactory() { 
     try {   
      Configuration configuration = new Configuration().configure("hibernate.cfg.xml");  
      return configuration.buildSessionFactory(new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build()); 
     } 
     catch (Throwable ex) {     
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 
} 

Message.java

package 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="message") 
public class Message { 

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

    @Column(name="TEXT")  
    private String text; 

    public Message() {} 
    public Message(String text) { 
     this.text = text; 
    } 
} 

的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> 

     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://localhost:3306/hello</property> 
     <property name="connection.username">root</property> 
     <property name="connection.password">pass</property> 

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

     <mapping class="entity.Message"/> 

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

SQL數據庫架構(RDBMS:MYSQL)

CREATE DATABASE `hello`; 
USE `hello`; 
CREATE TABLE `message` (
`ID` BIGINT(20) NOT NULL AUTO_INCREMENT, 
`TEXT` VARCHAR(255) NULL DEFAULT NULL, 
PRIMARY KEY (`ID`) 
); 
+0

你的目錄結構是 –

+0

@JunedAhsan:它是一種在Eclipse IDE中使用'src'作爲類路徑中的源文件夾。 ''hibernate.cfg.xml'就在'src'文件夾下。 'Main.java'包含在'client'包中,'util'包中的'HibernateUtil.java'和'entity'包中的'Message.java'。 – skip

+0

我認爲它是因爲你沒有在你的hibernate-cfg.xml中設置一個默認模式屬性。讓我看看,我會馬上回答你的問題 – javaguest

回答

11

更新:在Hibernate 5.0 .x,標準服務註冊表的配置爲棄用

相反,你應該用引導它:

在你HibernateUtil類,你應該添加

private static SessionFactory buildSessionFactory() { 
    try {   
     StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder() 
     .configure("hibernate.cfg.xml") 
     .build(); 

     Metadata metadata = new MetadataSources(standardRegistry) 
     .getMetadataBuilder() 
     .build(); 

     return metadata.getSessionFactoryBuilder().build(); 

    } 

而作爲一個側面說明,更改消息類ID聲明到

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="ID") 
private Long id; 

所以hibernate可以pro perly使用mySql的自動增量,否則會引發異常。

+0

它沒有任何區別。我正在收到同樣的錯誤。 – skip

+0

好吧,即時通訊設置一個新的項目,爲了調試它,你使用的是maven嗎? – javaguest

+0

不要聽起來像一個屁股,但我在日食重新創建你的項目,它的工作完美。我在github上分享了它:https://github.com/bruno-cw/pizzadepot/tree/master/Hibernate 如果你可以分享你的,那麼識別什麼是錯誤的將是一個很大的幫助。 我排除了db的任何問題, – javaguest

0

或者,你可以做在休眠5+以下,有你的SessionFactory/Session創建類extendHibernateHelper類下面:

package com.company.hibernatehelper;

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 

public class HibernateHelper { 
    private static SessionFactory sessionFactory = null; 

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

相關問題