web-dev-qa-db-ja.com

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

階層を考慮してください:

enter image description here

そして、次のクラスとxml:

HibernateUtil.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;
    }
}

sers.Java

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>

Main()を実行すると、次のエラーが出力ウィンドウに表示されます。

org.hibernate.MappingException: Unknown entity: annotations.Users

しかし、エンティティUsersannotationsパッケージにあるので、何が問題なのでしょうか?

39
JAN

Hibernate構成ファイルは、エンティティクラスを定義する必要があります。

<mapping class="annotations.Users"/>

または、次を使用して明示的にクラスを構成に追加する必要があります

configuration.addClass(annotations.Users.class)
// Read mappings as a application resourceName
 // addResource is for add hbml.xml files in case of declarative approach
configuration.addResource("myFile.hbm.xml");  // not hibernateAnnotations.cfg.xml
68
Asif Bhutto

注釈を使用するように(tutorialspointから)サンプルを書き直そうとしたときに、同じ例外が発生しました。これは私を助けました(addAnnotatedClass()):

Configuration cfg=new Configuration(); 
cfg.addAnnotatedClass(com.tutorialspoint.hibernate.entity.Employee.class);
cfg.configure();
12
user5728489

以下を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>
7
user2247545

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

私は同じ問題を抱えていました。

@javax.persistence.Entityの代わりにorg.hibernate.annotations.Entityを使用します

5

エンティティがアノテーションを介してマッピングされている場合、次のコードを構成に追加します。

configuration.addAnnotatedClass(theEntityPackage.EntityClassName.class);

例えば;

configuration.addAnnotatedClass(com.foo.foo1.Products.class);

エンティティがxmlファイルでマップされている場合、addAnnotatedClassの代わりにaddClassを使用します。

例として。

configuration.addClass(com.foo.foo1.Products.class);

さらにサポートが必要な場合は、pingを送信してください。

3
Ad Infinitum

私は同じ問題に直面しており、ほぼ2時間検索し、古い休止状態の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);

その後、正常に動作します。

3
JR Sahoo.'JS'

受け入れられた答えは、コードで発生した例外を解決するのに役立ちませんでした。そして、技術的には間違っていませんが、他の提案にも満足していませんでした冗長性を導入するには:

  • configuration.addAnnotatedClass(...)を使用して、マップされたクラスをプログラムで再追加します
  • hbm.xmlファイルと、既存の注釈と重複するリソースマッピングをhibernate_test.cfg.xmlに作成します
  • 元の質問で言及されていない外部依存関係を使用して、(すでにマップされた)クラスが存在するパッケージをスキャンします

しかし、私は共有したい2つの可能な解決策を見つけました。どちらも私自身のコードで遭遇した例外を個別に解決しました。

私は@ronと同じMappingExceptionを使用していました(ほぼ同じHibernateUtilクラスを使用)。

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
}

hibernate_test.cfg.xml構成ファイル内に、必要なクラスマッピングがあります。

<mapping class="myPackage.Device"/>

そして、私のDeviceクラスにはjavax.persistence.Entityアノテーションが適切に注釈されています:

package myPackage.core;
import javax.persistence.*;

@Entity
@Table( name = "devices" )
public class Device {
    //body omitted for brevity
}

2つの可能な解決策:

最初に、Hibernate 5.2を使用しています。Hibernate5を使用している場合は、MetadataSessionFactoryを構築するオブジェクトは動作するはずです。 Hibernate Getting Started Guide の現在推奨されている native bootstrap mechanism も表示されます:

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

SecondConfigurationHibernate 5で半推奨 、@ ronは彼が使用しているHibernateのバージョンを言わなかったため、このソリューションは一部の人にとっても価値があるかもしれません。

ConfigurationおよびServiceRegistryオブジェクトをインスタンス化および構成するときに、操作の順序に非常に微妙な変更があり、自分のコードにすべての違いが生じることがわかりました。

元の順序ConfigurationServiceRegistryの前に作成および構成されます):

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

新しい注文ServiceRegistryConfigurationの前に作成および構成されます):

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

TLDRの危険があるので、hibernate_test.cfg.xmlに関しては、configuration.getProperties()メソッドは<property />要素のみを返し、<mapping />要素は除外されることをテストが示唆していることも指摘します。これは、 APIドキュメント for Configuration内の用語 'property'および 'mapping'の特定の使用と一致しているようです。この振る舞いは、applySettings()StandardServiceRegistryBuilderへのマッピングデータを生成できなかったことと関係がある可能性があることを認めます。ただし、このマッピングデータはConfigurationオブジェクトの構成中に既に解析されており、buildSessionFactory()が呼び出されたときに利用可能になっているはずです。したがって、ServiceRegistryConfigurationオブジェクトのbuildSessionFactory()メソッドに渡される場合、これはリソースの優先順位に関する実装固有の詳細によるものと思われます。

私はこの質問が数年前のものであることを知っていますが、この答えが私がそれを導き出すのに費やした研究の時間を誰かに救うことを願っています。乾杯!

3
Philip Wrage

HibernateUtil.Javaを使用する代わりに、セッションファクトリオブジェクトを作成するには、これを使用する必要があります。

SessionFactory sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();

例外を回避するために、HibernateUtil.Javaファイルのクラスオブジェクトをconfiguration.addAnnotatedClass(Student_Info.class);として宣言する必要があります。これは、hibernate.cfg.xmlファイルに既にエントリを提供しているため、見苦しいように見えます。

AnnotationConfigurationクラスを使用するには、プロジェクトビルドパスにjarを追加する必要があります。 http://www.Java2s.com/Code/Jar/h/Downloadhibernate353jar.htm

1
Narendra Rawat

私は同様の問題を抱えていて、追加していました

 sessionFactory.setAnnotatedClasses(User.class);

この行は助けましたが、その前に私は持っていました

sessionFactory.setPackagesToScan(new String[] { "com.rg.spring.model" });

なぜそれが機能していないのか分かりません。ユーザークラスはcom.rg.spring.modelの下にありますpackagesToScanメソッドを介して動作させる方法を教えてください。

1
Rakesh Goswami
 public static void main(String[] args) {
      try{
        // factory = new Configuration().configure().buildSessionFactory();
         factory = new AnnotationConfiguration().
                   configure().
                   //addPackage("com.xyz") //add package if used.
                   addAnnotatedClass(Employee.class).
                   buildSessionFactory();
      }catch (Throwable ex) { 
         System.err.println("Failed to create sessionFactory object." + ex);
         throw new ExceptionInInitializerError(ex); 
      }//you can write like this in your test class inside main method.this way you will be able to do the things using annotaions only
0
Mithun Debnath

5.0xバージョンを使用している場合、標準サービスレジストリを使用した設定は非推奨です。

代わりに、bootstrap it with Metadata:HibernateUtilクラスで、追加する必要があります

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(...) {
        ...
    }
}
0
Sanjay Maredla

パッケージ名がdispatcher-servlet.xmlのproperty 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>
0
Master Mind

次のコードを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>
0
Sandy

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>

この方法では、休止状態のマッピングファイルですべてのエンティティを宣言する必要はありません。

0
M Faisal Hameed

私の場合、hibernateUtillクラスのconfiguration.addAnnotatedClass(com.myApp.model.Example.class);の後にConfiguration configuration = new Configuration().configure(HibernateUtil.class.getResource("/hibernate.cfg.xml"));を追加することで解決します。クラスアノテーションメタデータからマッピングを読み取ります。 addAnnotatedClass()の詳細については、 here を参照してください。

0
Irfan