Hibernate報錯org.hibernate.MappingException: Unknown entity(5.x以後的版本)

org.hibernate.MappingException: Unknown entity

這句報錯的原因是映射沒有成功,查看Bean和Hibernate的主配置文件和映射配置文件如下:

import javax.persistence.Column;

import javax.persistence.Entity;//這裏要注意導入的包,不是import org.hibernate.annotations.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="news_inf")
public class News {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="id")
	private Integer id;
	@Column(name="title")
	private String title;
	@Column(name="content")
	private String content;
	/*此處省略getter和setter方法    */
	//構造方法=====》在MyEclips中是有快捷鍵的,可直接按ALT+S就可以了,其中包含了有參和無參構造方法,
        //getter和setter方法,以及hashCode()和equals()方法等等·······
    public News() {	}    
    public News(String title, String content) {
		super();
		this.title = title;
		this.content = content;
	}
//重寫hashCode()和equals()方法
	@Override
	public int hashCode() {
		//此處省略
	}
	@Override
	public boolean equals(Object obj) {
		//此處省略
	}
}

hibernate.cfg.xml的配置和正常的一樣,只有一個地方不同,

有的人喜歡這樣進行映射:<mapping resource="org/crazyit/app/domain/News.hbm.xml"/>

我的方式是這種:<mapping class="org.crazyit.app.domain.News"/>

第一種方式,需要另外進行配置*.hbm.xml文件,第二種方式採種註解形式,減少了代碼量。

NewsManager.java

public class NewsManager
{
	public static void main(String[] args)
		throws Exception
	{
		// 實例化Configuration,
		Configuration conf = new Configuration()
		// 不帶參數的configure()方法默認加載hibernate.cfg.xml文件,
		// 如果傳入abc.xml作爲參數,則不再加載hibernate.cfg.xml,改爲加載abc.xml
			.configure();
		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
			.applySettings(conf.getProperties()).build();
		// 以Configuration實例創建SessionFactory實例
		SessionFactory sf = conf.buildSessionFactory(serviceRegistry);
		// 創建Session
		Session sess = sf.openSession();
		// 開始事務
		Transaction tx = sess.beginTransaction();
		// 創建消息對象
		News n = new News("你好嗎","我很好");		
		// 保存消息
		sess.save(n);
		// 提交事務
		tx.commit();
		// 關閉Session
		sess.close();
		sf.close();
	}
}

上面的代碼看其實確實是對的,但是就是報錯,最終發現是版本問題 ,版本問題,版本問題《重要的事情說3遍》

上面的是在Hibernate3.x及Hibernate4.x,而我使用的是Hibernate5.x,所以代碼有變化。

所以我改成了這樣就可以了:

public class NewsManager {

	public static void main(String[] args) {

		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
				.configure().build();
		SessionFactory sf = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
		Session sess = sf.openSession();
		Transaction tx = sess.beginTransaction();
		News n = new News("你好嗎","我很好");
		sess.save(n);
		tx.commit();
		sess.close();
	}

}

上面的問題影響了我一天,連六一都過不好,哈哈!!!

希望可以幫到你********************************************************


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章