web-dev-qa-db-ja.com

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

エラーメッセージorg.hibernate.MappingException: Unknown entity hibernate 5.0をmysqlと統合しようとしているとき

これはhibernate5.0.0および5.0.1の問題のようです。これはhibernate 4.3.9で正常に動作します

Mavenの依存関係

<dependency>
    <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.0.0.Final</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-Java</artifactId>
        <version>5.1.36</version>
</dependency>

hibernate.cfg.xml

<session-factory>

    <!-- Database connection settings -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3307/SampleDB
    </property>
    <property name="connection.username">root</property>
    <property name="connection.password"></property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">create</property>

    <mapping class="UserA.User"></mapping>

</session-factory>

HibernateMain.Javaコード

package UserA;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.mapping.Map;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.service.ServiceRegistry;

public class HibernateMain {

    public static void main(String[] args) {

        Configuration configuration = new Configuration();
        configuration.configure();
        ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();

        SessionFactory sf = configuration.buildSessionFactory(sr);




        User user1 = new User();
        user1.setUserName("Arpit");
        user1.setUserMessage("Hello world from arpit");
        user1.setUserId(22);

        Session ss = sf.openSession();
        ss.beginTransaction();
        // saving objects to session
        ss.save(user1);
        ss.getTransaction().commit();
        ss.close();

    }

}

User.Java

package UserA;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity(name="User_table")
public class User {
    @Id
    int userId;
    @Column(name = "User_Name")
    String userName;

    @Column(name = "User_Message")
    String userMessage;

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserMessage() {
        return userMessage;
    }

    public void setUserMessage(String userMessage) {
        this.userMessage = userMessage;
    }

}
14
Mamta Garg

Hibernate 5で同じ問題を修正しました。このコードに問題があります

_Configuration configuration = new Configuration();
configuration.configure();

ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(
    configuration.getProperties()).build();

SessionFactory sf = configuration.buildSessionFactory(sr);
_

このコードはHibernate 4.3.5では正常に機能しますが、同じコードにはHibernate 5でも同じ問題があります。

Hibernate 5を使用してconfiguration.buildSessionFactory(sr)を実行すると、Configurationconfiguration.configure()を呼び出して取得したマッピングに関するすべての情報を失います。

ソリューション

この問題を解決するには、標準構成ファイル_hibernate.cfg.xml_および_hibernate.properties_を使用する場合、この方法で(ServiceRegistryなしで)セッションファクトリを作成できます。

_SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
_

プロパティの読み込み

_hibernate.properties_以外のファイルにプロパティがある場合は、StandardServiceRegistryBuilderを使用してセッションファクトリをビルドできます(とにかく、_hibernate.properties_と他のファイルがある場合は、両方がロードされます)

プロパティをリソースとして読み込むには

_ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().
    configure().loadProperties("hibernate-h2.properties").build();
SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry);  
_

クラスパス(sourcesフォルダー、resourcesフォルダーのルート)に_hibernate-h2.properties_が必要です。ルートソースフォルダーからのパスも_/com/github/xxx/model/hibernate-h2.properties_で指定できます。

ファイルシステムのパスからプロパティをロードするには

_File propertiesPath = new File("some_path");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().
    configure().loadProperties(propertiesPath).build();
SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry);
_

fluent-hibernate-mysql でこのアプローチを使用したコンソールアプリケーションの例を見つけることができます。ユーティリティクラスを使用して fluent-hibernateライブラリ からセッションファクトリを構築します。

誤ったHibernate 5チュートリアル

Hibernate 5チュートリアルに誤った例があります 1.1.6。Startup and helpers 。このコードを使用します

_ return new Configuration().configure().buildSessionFactory(
                new StandardServiceRegistryBuilder().build() );
_

適切な構成を行いません。

27
v.ladynev

Hibernate 5では、StandardServiceRegistryをビルドするためにMetadataSessionFactoryをビルドする必要があります。次のHibernateUtilを使用して、SessionFactoryをビルドできます。 hibernate.cfg.xmlは、アプリケーションのクラスパスのルートにある必要があります。

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder() .configure("hibernate.cfg.xml").build();
            Metadata metadata = new MetadataSources(standardRegistry).getMetadataBuilder().build();
            return metadata.getSessionFactoryBuilder().build();
        } 
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

また、Hibernate 5を使用し、識別子生成戦略として@Idを使用している場合、GenerationType.AUTOを使用すると、MySQLでデフォルトで「シーケンス」IDジェネレーターが選択され、com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SampleDB.hibernate_sequence' doesn't exist例外。エンティティの識別子属性で設定されていない場合。 Hibernate 5では、代わりにGenerationType.IDENTITYを使用してください。

6
skip

マッピングファイルUser.hbm.xmlまたはUser.xmlファイルを作成し、そのファイルをhibernate.cfg.xmlに含めたことを確認してください。

0
Chetan chadha

これを使用して:

SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);

Session session = sessionFactory.openSession();

これの代わりに:

SessionFactory factory = new Configuration().configure().buildSessionFactory();

Session session = factory.openSession();

hibernate 5.2.10.Finalの問題を解決しました。

0
zygimantus

設定ファイルを追加しませんでした

configuration.configure("/hibernate.cfg.xml");
0
user2173738

私は同じ問題に直面していたので、ほぼ2時間検索し、古い休止状態のjarファイルを置き換えて、dbテーブルスキーマを変更するなど、さまざまな方法を試しました。しかし、最終的に次のような解決策を得ました。

 //This line to be replaced with below commented line
 SessionFactory factory = new Configuration().configure().buildSessionFactory();

上記の置換

Configuration config = new Configuration().configure();
ServiceRegistry servReg = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory factory = config.buildSessionFactory(servReg);

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

0
JR Sahoo.'JS'