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

}

上面的问题影响了我一天,连六一都过不好,哈哈!!!

希望可以帮到你********************************************************


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