org.hibernate.MappingException:未知实体

我正在尝试使用Beginning Hibernate第二版,而我却试图将简单的工作示例与HSQLDB放在一起。

当我运行ant populateMessages ,我得到了

 [java] org.hibernate.MappingException: Unknown entity: sample.entity.Message [java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:194) [java] at org.apache.tools.ant.taskdefs.Java.run(Java.java:747) ... 

这是我得到的:

Message.java

 package sample.entity; import org.hibernate.annotations.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity public class Message { private String messageText; private Integer id; public Message( String messageText ) { this.messageText = messageText; } public Message() { } public String getMessageText() { return messageText; } public void setMessageText(String messageText) { this.messageText = messageText; } @Id @GeneratedValue public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } } 

PopulateMessages.java

 package sample; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.cfg.Configuration; import sample.entity.Message; import java.util.Date; public class PopulateMessages { public static void main(String[] args) { SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory(); Session session = factory.openSession(); session.beginTransaction(); Message m1 = new Message("Hibernated a messages on " + new Date()); session.save(m1); session.getTransaction().commit(); session.close(); } } 

build.properties

 # Path to the hibernate install directory hibernate.home=C:/hibernate/hibernate-3.5.6 # Path to the hibernate-tools install directory hibernate.tools.home=C:/hibernate/hibernate-tools # Path to hibernate-tools.jar relative to hibernate.tools.home hibernate.tools.path=/plugins/org.hibernate.eclipse_3.3.1.v201006011046R-H111-GA/lib/tools # Path to hibernate-tools hibernate libraries relative to hibernate.tools.home hibernate.tools.lib.path=/plugins/org.hibernate.eclipse_3.3.1.v201006011046R-H111-GA/lib/hibernate # Path to the SLF4J implementation JAR for the logging framework to use slf4j.implementation.jar=lib/slf4j-simple-1.6.1.jar # Path to the HSQL DB install directory hsql.home=C:/hsqldb 

的hibernate.cfg.xml

     jdbc:hsqldb:file:testdb;shutdown=true   org.hsqldb.jdbcDriver  sa  0  org.hibernate.dialect.HSQLDialect  false     

build.xml文件

                                        

您的实体未正确注释,您必须使用@javax.persistence.Entity注释。 您可以使用Hibernate扩展@org.hibernate.annotations.Entity来超越JPA提供的内容,但Hibernate注释不是替代,它是一个补充。

所以将代码更改为:

 import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity public class Message { ... } 

参考

  • Hibernate Annotations参考指南
    • 2.4。 Hibernate注释扩展

您应该在AnnotationConfiguration上调用.addAnnotatedClass(Message.class)

如果您希望自动发现您的实体,请使用EntityManager (JPA)

( 参考 )

更新:您似乎已在hibernate.cfg.xml中列出了该类。 因此不需要自动发现。 顺便说一下,试试javax.persistence.Entity

如果需要自动发现类,则应在.addAnnotatedClass(Class)方法中添加所有实体文件。

使用此链接,它可能有帮助..

http://docs.jboss.org/hibernate/stable/core/api/org/hibernate/cfg/AnnotationConfiguration.html

当我切换到AnnotationSessionFactoryBean时遇到了同样的问题。 我之前使用的是entity.hbm.xml

我发现我的类在注释后遗失了,这解决了我的问题:

 @Entity @Table(name = "MyTestEntity") @XmlRootElement 

如果您在SpringBoot应用程序中获得此exception,即使实体使用Entity批注进行批注,也可能是因为spring不知道在哪里扫描实体

要明确指定包,请在下面添加

 @SpringBootApplication @EntityScan({"model.package.name"}) public class SpringBootApp {...} 

注意:如果模型类驻留在SpringBootApplication注释类的相同或子包中,则无需显式声明EntityScan ,默认情况下它将扫描

使用import javax.persistence.Entity; 而不是导入org.hibernate.annotations.Entity;

在Spring Boot Main Class的情况下使用以下代码行添加Spring引导主类@EntityScan(basePackageClasses = YourClassName.class)

在弹簧启动应用程序的情况下使用下面的代码行。

@EntityScan(basePackageClasses = YourClassName.class)

在hibernate.cfg.xml中,请输入以下代码