通过" Hibernate简介"关于PluralSight的教程。我有这个异常错误。完整的错误是:
Exception in thread "main" org.hibernate.MappingException: Unknown entity: com.simpleprogrammer.User
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 com.simpleprogrammer.Program.main(Program.java:15)
不确定是什么问题。我创建了User.java pojo。我创建了一个与pojo匹配的表。我创建了映射,然后将映射添加到hibernate.cfg.xml文件中。但是,仍然得到错误。任何人都可以帮我解决这个问题吗?
的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 name="">
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.default_schema">protein_tracker</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping class="com.simpleprogrammer.User" resource="com/simpleprogrammer/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Program.java
public class Program {
public static void main(String[] args) {
System.out.println("Hello World!");
Session session = HibernateUtilities.getSessionFactory().openSession();
session.beginTransaction();
User user = new User();
user.setName("Joe");
user.setGoal(250);
session.save(user);
session.getTransaction().commit();
session.close();
HibernateUtilities.getSessionFactory().close();
}
}
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Oct 17, 2015 11:44:47 AM by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.simpleprogrammer.User" table="USERS">
<id name="id" type="int">
<column name="ID" />
<generator class="identity" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="total" type="int">
<column name="TOTAL" />
</property>
<property name="goal" type="int">
<column name="GOAL" />
</property>
</class>
</hibernate-mapping>
User.java
package com.simpleprogrammer;
public class User {
private int id;
private String name;
private int total;
private int goal;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public int getGoal() {
return goal;
}
public void setGoal(int goal) {
this.goal = goal;
}
}
HibernateUtilities.java
package com.simpleprogrammer;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateUtilities {
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
static {
try {
Configuration configuration = new Configuration().configure();
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
catch(HibernateException exception) {
System.out.println("Problem creating session factory!");
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
答案 0 :(得分:11)
LinhSaysHi,我用Hibernate 5执行了你的代码,我有完全相同的错误。 我用Hibernate 4执行它并且没有问题。
已经为Hibernate 4创建了Pluralsight教程。 这是一个与Hibernate 5配合使用的会话工厂构建器:
public class HibernateUtilities_5 {
private static final SessionFactory sessionFactory = buildSessionFactory();
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();
} catch (HibernateException he) {
System.out.println("Session Factory creation failure");
throw he;
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
答案 1 :(得分:7)
在使用Hibernate 5.1.1进行尝试时,我也遇到了同样的错误。但是我通过用StandardServiceRegistryBuilder替换ServiceRegistry接口并使用“metadatasources”来创建会话工厂来解决它。请参阅下面的代码
func md5(string: String) -> String {
var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0)
if let data = string.dataUsingEncoding(NSUTF8StringEncoding) {
CC_MD5(data.bytes, CC_LONG(data.length), &digest)
}
var digestHex = ""
for index in 0..<Int(CC_MD5_DIGEST_LENGTH) {
digestHex += String(format: "%02x", digest[index])
}
return digestHex
}
func phpassHash(password: String, salt: String, iterations: Int) -> String {
var hash = md5(salt+password)
for _ in 0..<iterations {
hash = md5(hash+password)
}
return hash;
}
我做了这些改变,它就像一个魅力。 请在代码中更改加载配置文件的方式并再次尝试。如果你仍然面临障碍,请告诉我。
答案 2 :(得分:2)
请检查您在MySQL中创建的模式名称以及hibernate.cfg文件中指定的模式名称。这对我来说不匹配,我遇到了同样的问题。
同样修改下面的连接URL并从hibernate.cfg中删除默认架构字段。 JDBC:MySQL的://本地主机:3306 / protein_tracker
这对我有用。
答案 3 :(得分:1)
根据Hibernate 5
更改代码 static
{
try {
//Configuration configuration = new Configuration().configure();
serviceRegistry = new
StandardServiceRegistryBuilder().configure("hibernate.cfg.xml")
.build();
Metadata metadata = new MetadataSources(serviceRegistry)
.getMetadataBuilder().build();
sessionFactory = metadata.getSessionFactoryBuilder().build();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
给出了
在user.hbm.xml中提供完整的类路径
<class name="com.simpleprogrammer.Users" table="USERS">
在hibernate.cfg.xml中映射资源
<mapping resource="com/simpleprogrammer/Users.hbm.xml"/>
并执行以下代码
Session session = HibernateUtilities.getSessionFactory().openSession();
session.beginTransaction();
Users user = new Users();
user.setuserName("Prince");
user.setGoal(100);
user.setId(101);
user.setTotal(10);
session.save(user);
session.getTransaction().commit();
session.close();
HibernateUtilities.getSessionFactory().close();
答案 4 :(得分:0)
我使用了你的例子,并且能够通过一些小的调整来实现它。
已验证User.hbm.xml位于src / main / resources / com / simpleprogrammer中。已更改为小写table="users"
然后在hibernate.cfg.xml中:
name=""
属性。<property name="hibernate.connection.password">SomePassword</property>
<property name="hibernate.hbm2ddl.auto">create</property>
答案 5 :(得分:0)
映射有一个小问题。确保指定的路径正确。 当我遇到同样的问题时,我只将hibernate.cfg.xml中的映射重新修改为
<mapping class="com.simpleprogrammer.User"/>
未添加资源之类的其他属性
答案 6 :(得分:0)
Hibernate jars存在问题... 在这里我可以看到您正在使用Hibernate 4 ....来开发项目... 所以添加休眠4.3.5 jar应该可以工作......
如果您不使用元数据,最好使用休眠4.3罐