Java org.hibernate.MappingException:未知实体:annotations.Users
考虑层次结构: 以及以下类和xml: HibernateUtil.javaJava org.hibernate.MappingException:未知实体:annotations.Users,java,hibernate,exception,entity,Java,Hibernate,Exception,Entity,考虑层次结构: 以及以下类和xml: HibernateUtil.java package annotations; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; /** * *
package annotations;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
/**
*
* @author X3
*
*/
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static final String HIBERNATE_CFG = "hibernateAnnotations.cfg.xml";
private static SessionFactory buildSessionFactory()
{
Configuration cfg = new Configuration().addResource(HIBERNATE_CFG).configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().
applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
package annotations;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.sql.Timestamp;
@Entity
@Table(name = "Users")
public class Users {
@Id
@GeneratedValue
@Column(name = "USER_ID")
private long userID;
@Column(name = "USERNAME", nullable = false, length = 100)
private String username;
@Column(name = "MessageTimeDate", nullable = false)
private java.sql.Timestamp datetime;
@Column(name = "UserMessage", nullable = false)
private String message;
public Users(String username , String message)
{
java.util.Date date = new java.util.Date();
this.datetime = new Timestamp(date.getTime());
this.username = username;
this.message = message;
}
public long getUserID() {
return userID;
}
public void setUserID(long userID) {
this.userID = userID;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public java.sql.Timestamp getDatetime() {
return datetime;
}
public void setDatetime(java.sql.Timestamp datetime) {
this.datetime = datetime;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Users.java
package annotations;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
/**
*
* @author X3
*
*/
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static final String HIBERNATE_CFG = "hibernateAnnotations.cfg.xml";
private static SessionFactory buildSessionFactory()
{
Configuration cfg = new Configuration().addResource(HIBERNATE_CFG).configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().
applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
package annotations;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.sql.Timestamp;
@Entity
@Table(name = "Users")
public class Users {
@Id
@GeneratedValue
@Column(name = "USER_ID")
private long userID;
@Column(name = "USERNAME", nullable = false, length = 100)
private String username;
@Column(name = "MessageTimeDate", nullable = false)
private java.sql.Timestamp datetime;
@Column(name = "UserMessage", nullable = false)
private String message;
public Users(String username , String message)
{
java.util.Date date = new java.util.Date();
this.datetime = new Timestamp(date.getTime());
this.username = username;
this.message = message;
}
public long getUserID() {
return userID;
}
public void setUserID(long userID) {
this.userID = userID;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public java.sql.Timestamp getDatetime() {
return datetime;
}
public void setDatetime(java.sql.Timestamp datetime) {
this.datetime = datetime;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Main.java
package annotations;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
public class Main {
public static void main(String[] args) {
try
{
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
session.beginTransaction();
Users user1 = new Users("Jack" , "Hello");
session.save(user1);
session.getTransaction().commit();
session.close();
}
catch (Exception e)
{
System.out.println(e.toString());
e.getStackTrace();
}
}
}
和hibernateAnnotations.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>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/CHAT_DB</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.pool_size">1</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<mapping class="annotations.Users"></mapping>
</session-factory>
</hibernate-configuration>
但是实体
Users
在annotations
包中,那么怎么了 Hibernate配置文件必须定义实体类:
<mapping class="annotations.Users"/>
将以下内容添加到xml中:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan">
<list>
<value>annotations</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
注释
org.hibernate.dialogue.mysqldialogue
真的
对于使用Spring Java配置类的用户,您可以编写以下代码:
@Autowired
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(DataSource dataSource) {
LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
sessionBuilder.addProperties(getHibernateProperties());
sessionBuilder.addAnnotatedClasses(Foo.class);
sessionBuilder.addAnnotatedClasses(Bar.class);
sessionBuilder.addAnnotatedClasses(Bat.class);
return sessionBuilder.buildSessionFactory();
}
在Hibernate.cfg.xml中定义
实体
类
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
当我试图重写我的示例(从tutorialspoint)以使用注释时,我遇到了相同的异常。这对我有帮助(addAnnotatedClass()):
我也有同样的问题
使用
@javax.persistence.Entity
而不是org.hibernate.annotations.Entity
出现问题,因为hibernate.cfg.xml
中的条目mapping class=“annotations.Users”
删除该行即可
我也有同样的问题。当我删除上述行时,它对我来说工作正常。要创建sessionfactory对象,您应该使用以下命令,而不是使用HibernateUtil.java:
SessionFactory sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
因为为了避免异常,您必须将HibernateUtil.java文件中的class对象声明为configuration.addAnnotatedClass(Student\u Info.class)
看起来很愚蠢,因为我们已经在hibernate.cfg.xml文件中提供了条目
要使用AnnotationConfiguration类,必须将jar添加到项目构建路径:
将以下代码添加到hibernate.cfg.xml
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
5
20
300
50
3000
如果您的实体是通过注释映射的,请将以下代码添加到您的配置中
configuration.addAnnotatedClass(theEntityPackage.EntityClassName.class);
比如,
configuration.addAnnotatedClass(com.foo.foo1.Products.class);
如果实体映射为xml文件,请使用addClass而不是addAnnotatedClass
例如,
configuration.addClass(com.foo.foo1.Products.class);
如果需要更多帮助,请点击我。我也遇到了同样的问题,我搜索了将近2个小时,并尝试了不同的可能方法,如更换旧的hibernate JAR和更改DB表模式。但最终得到的解决方案如下:
SessionFactory factory = new Configuration().configure().buildSessionFactory(); //This line to be replaced with below commented line
将上述内容替换为
//Configuration config = new Configuration().configure();
//ServiceRegistry servReg = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
//SessionFactory factory = config.buildSessionFactory(servReg);
然后它会很好地工作。我遇到了类似的问题并添加了
sessionFactory.setAnnotatedClasses(User.class);
这句话有帮助,但在此之前,我有
sessionFactory.setPackagesToScan(new String[] { "com.rg.spring.model" });
我不知道为什么那个不起作用。用户类在com.rg.spring.model下
请告诉我如何通过packagesToScan方法使其工作。检查dispatcher-servlet.xml中的属性packagesToScan中是否给出了包名
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="**entity package name here**"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
</props>
</property>
</bean>
${hibernate.dial}
${hibernate.show_sql}
如果您能够承受外部依赖,请使用EntityScanner。它将无缝地注入您的所有实体类,即使来自多个包。只需在配置设置后添加以下行
Configuration configuration = new Configuration().configure();
EntityScanner.scanPackages("com.fz.epms.db.model.entity").addTo(configuration);
// And following depencency if you are using Maven
<dependency>
<groupId>com.github.v-ladynev</groupId>
<artifactId>fluent-hibernate-core</artifactId>
<version>0.3.1</version>
</dependency>
Configuration配置=新配置().configure();
EntityScanner.scanPackages(“com.fz.epms.db.model.entity”).addTo(配置);
//如果您使用的是Maven,请遵循依赖关系
com.github.v-ladynev
流畅的休眠内核
0.3.1
通过这种方式,您不需要在hibernate映射文件中声明所有实体。我发现接受的答案对解决代码中遇到的异常没有帮助。虽然在技术上不正确,但我也不满意其他人关于引入冗余的建议:
- 使用
configuration.addAnnotatedClass(…)
- 在
中创建一个hibernate\u test.cfg.xml
文件和资源映射,这些文件和映射对现有注释是多余的hbm.xml
- 使用原始问题中未提及的外部依赖项扫描(已映射)类存在的包
MappingException
(使用了一个几乎相同的HibernateUtil
类):
在我的hibernate\u test.cfg.xml
配置文件中,我有所需的类映射:
<mapping class="myPackage.Device"/>
两种可能的解决方案:
首先,我使用的是Hibernate 5.2,对于那些使用Hibernate 5的人来说,使用元数据
对象来构建会话工厂
应该是可行的。它似乎也是当前推荐的:
Second,而Configuration
是,@ron没有说他使用的是哪个版本的Hibernate,所以这个解决方案对某些人来说也可能有价值
在实例化和配置Configuration
和ServiceRegistry
对象时,我发现操作顺序发生了非常微妙的变化,从而使我自己的代码与众不同。
原始订单(Configuration
在ServiceRegistry
之前创建和配置):
新订单(ServiceRegistry
在Configuration
之前创建和配置):
冒着TLDR的风险,我还要指出,关于hibernate\u test.cfg.xml
,我的测试表明configuration.getProperties()
方法只返回
元素,而
元素被排除在外。这与for配置中术语“属性”和“映射”的具体用法一致。我会让步的
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="**entity package name here**"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
</props>
</property>
</bean>
Configuration configuration = new Configuration().configure();
EntityScanner.scanPackages("com.fz.epms.db.model.entity").addTo(configuration);
// And following depencency if you are using Maven
<dependency>
<groupId>com.github.v-ladynev</groupId>
<artifactId>fluent-hibernate-core</artifactId>
<version>0.3.1</version>
</dependency>
public final class HibernateUtil {
private static SessionFactory sessionFactory = null;
private static ServiceRegistry serviceRegistry = null;
private HibernateUtil() {}
public static synchronized SessionFactory getSessionFactory() {
if ( sessionFactory == null ) {
Configuration configuration = new Configuration().configure("hibernate_test.cfg.xml");
serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.build();
sessionFactory = configuration.buildSessionFactory( serviceRegistry );
}
return sessionFactory;
}
// exception handling and closeSessionFactory() omitted for brevity
}
<mapping class="myPackage.Device"/>
package myPackage.core;
import javax.persistence.*;
@Entity
@Table( name = "devices" )
public class Device {
//body omitted for brevity
}
public static synchronized SessionFactory getSessionFactory() {
if ( sessionFactory == null ) {
// exception handling omitted for brevity
serviceRegistry = new StandardServiceRegistryBuilder()
.configure("hibernate_test.cfg.xml")
.build();
sessionFactory = new MetadataSources( serviceRegistry )
.buildMetadata()
.buildSessionFactory();
}
return sessionFactory;
}
public static synchronized SessionFactory getSessionFactory() {
if ( sessionFactory == null ) {
// exception handling omitted for brevity
Configuration configuration = new Configuration().configure("hibernate_test.cfg.xml");
serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings( configuration.getProperties() )
.build();
sessionFactory = configuration.buildSessionFactory( serviceRegistry );
}
return sessionFactory;
}
public static synchronized SessionFactory getSessionFactory() {
if ( sessionFactory == null ) {
// exception handling omitted for brevity
serviceRegistry = new StandardServiceRegistryBuilder()
.configure("hibernate_test.cfg.xml")
.build();
sessionFactory = new Configuration().buildSessionFactory( serviceRegistry );
}
return sessionFactory;
}
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(...) {
...
}
}
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
Metadata metadata = metadataSources.getMetadataBuilder().build();
SessionFactory sessionFactory= metadata.getSessionFactoryBuilder().build();
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.service.ServiceRegistry;
Configuration configuration = new Configuration();
configuration.setProperty("hibernate.current_session_context_class", "thread");
configuration.setProperty(Environment.DRIVER, "org.postgresql.Driver");
configuration.setProperty(Environment.URL, lmsParams.getDbProperties().getDbURL());
configuration.setProperty(Environment.USER, lmsParams.getDbProperties().getUsername());
configuration.setProperty(Environment.PASS, lmsParams.getDbProperties().getPassword());
configuration.setProperty("hibernate.connection.release_mode", "auto");
configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
configuration.setProperty("hibernate.show_sql", "true");
configuration.setProperty(Environment.HBM2DDL_AUTO, "create");
configuration.addAnnotatedClass(LMSSourceTable.class);
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.build();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.11</version>
</dependency>
MetadataSources metadataSources = new
MetadataSources(serviceRegistry);
Reflections entityPackageReflections = new Reflections("com.company.abc.package.name");
entityPackageReflections.getTypesAnnotatedWith(Entity.class).forEach(metadataSources::addAnnotatedClass);
Metadata metadata = metadataSources.getMetadataBuilder().build();
SessionFactory sessionFactory= metadata.getSessionFactoryBuilder().build();
<!-- Configu Hibernate session factory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="packagesToScan" value="SCANN_YOUR_PACKAGE.controller.entity" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>