web-dev-qa-db-ja.com

org.hibernate.MappingException:不明なエンティティ

Beginning Hibernate 2nd editionを実行しようとしていますが、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

<!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="hibernate.connection.url">
jdbc:hsqldb:file:testdb;shutdown=true
</property>
<property name="hibernate.connection.driver_class">
org.hsqldb.jdbcDriver
</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.connection.pool_size">0</property>
<property name="hibernate.dialect">
org.hibernate.dialect.HSQLDialect
</property>
<property name="hibernate.show_sql">false</property>
<!-- "Import" the mapping resources here -->
<mapping class="sample.entity.Message"/>
</session-factory>
</hibernate-configuration>

build.xml

<project name="sample">
    <property file="build.properties"/>
    <property name="src" location="src"/>
    <property name="bin" location="bin"/>
    <property name="sql" location="sql"/>
    <property name="hibernate.tools"
              value="${hibernate.tools.home}${hibernate.tools.path}"/>
    <path id="classpath.base">
        <pathelement location="${src}"/>
        <pathelement location="${bin}"/>
        <pathelement location="${hibernate.home}/hibernate3.jar"/>
        <pathelement location="${slf4j.implementation.jar}"/>
        <fileset dir="${hibernate.home}/lib" includes="**/*.jar"/>
        <pathelement location="${hsql.home}/lib/hsqldb.jar"/>
  <fileset dir="./lib" includes="**/*.jar"/>
    </path>
<path id="classpath.tools">
    <path refid="classpath.base"/>
    <pathelement
            location="${hibernate.tools.home}/${hibernate.tools.lib.path}/commons-logging-1.0.4.jar"/>
    <pathelement
            location="${hibernate.tools}/freemarker.jar"/>
    <pathelement
            location="${hibernate.tools}/hibernate-tools.jar"/>
</path>
<taskdef name="htools"
         classname="org.hibernate.tool.ant.HibernateToolTask"
         classpathref="classpath.tools"/>
<target name="exportDDL" depends="compile">
    <mkdir dir="${sql}"/>
    <htools destdir="${sql}">
        <classpath refid="classpath.tools"/>
        <annotationconfiguration
                configurationfile="${src}/hibernate.cfg.xml"/>
        <hbm2ddl drop="true" outputfilename="sample.sql"/>
    </htools>
</target>
<target name="compile">
    <javac srcdir="${src}" destdir="${bin}" classpathref="classpath.base"/>
</target>
<target name="populateMessages" depends="compile">
    <Java classname="sample.PopulateMessages" classpathref="classpath.base"/>
</target>
<target name="listMessages" depends="compile">
    <Java classname="sample.ListMessages" classpathref="classpath.base"/>
</target>
22
Stefan Kendall

エンティティに正しく注釈が付けられていないため、must@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 { 
    ...  
}

参照資料

34
Pascal Thivent

AnnotationConfiguration.addAnnotatedClass(Message.class)を呼び出す必要があります。

エンティティを自動検出する場合は、EntityManager(JPA)を使用します

参照

更新:hibernate.cfg.xmlにクラスがリストされているようです。したがって、自動検出は必要ありません。ちなみに、javax.persistence.Entity

12
Bozho

追加後に問題が解決しました
sessionFactory.setPackagesToScan(new String [] {"com.springhibernate.model"});スプリングブートの最新バージョン2.1.2でこの機能をテストしました。

完全な方法:

 @Bean( name="sessionFactoryConfig")
    public LocalSessionFactoryBean sessionFactoryConfig() {

        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();

        sessionFactory.setDataSource(dataSourceConfig());
        sessionFactory.setPackagesToScan(
                new String[] { "com.springhibernate.model" });

        sessionFactory.setHibernateProperties(hibernatePropertiesConfig());

        return sessionFactory;
    }
0
Santosh Reddy

Spring BootアプリケーションをSpring Bootメインクラスに追加する場合は、以下のコード行を使用します@ EntityScan(basePackageClasses = YourClassName.class)

0
JavaDev

import javax.persistence.Entity;の代わりにimport org.hibernate.annotations.Entity;

0
Akanksha

クラスを自動検出する必要がある場合は、すべてのエンティティファイルを.addAnnotatedClass(Class)メソッドに追加する必要があります。

このリンクを使用すると、役立つ場合があります。

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

0
M.J.

スプリングブートアプリケーションの場合は、次のコード行を使用します。

@ EntityScan(basePackageClasses = YourClassName.class)

0
JavaDev

AnnotationSessionFactoryBeanに切り替えたときに同じ問題が発生しました。以前_entity.hbm.xmlを使用していました。

私のクラスでは、私の場合の問題を解決する注釈が欠落していることがわかりました。

@Entity
@Table(name = "MyTestEntity")
@XmlRootElement
0
Sanjay Ingole

エンティティにSpringBootアノテーションが付けられているにもかかわらず、Entityアプリケーションでこの例外が発生する場合は、スプリングがエンティティのスキャン場所を認識していないことが原因である可能性があります

パッケージを明示的に指定するには、以下を追加します

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

注:モデルクラスがSpringBootApplication注釈付きクラスの同じパッケージまたはサブパッケージにある場合、EntityScanを明示的に宣言する必要はありません。デフォルトではスキャンします

0
Saravana