1

hiberante 4 を使用しています。Factory 接続を作成しようとすると、このエラーが発生します。

Testlog4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Failed to create sessionFactory object.org.hibernate.HibernateException: src/hibernate.cfg.xml not found
Test

私のhibernate.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">org.Postgresql.Driver</property>
        <property name="connection.url">jdbc:postgresql://localhost:5432/hibernatedb</property>
        <property name="connection.username">postgres</property>
        <property name="connection.password">test</property>

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

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</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>

        <property name="hibernate.search.default.directory_provider">filesystem</property>
        <property name="hibernate.search.default.indexBase">target/indexes</property>
        <mapping class="org.mark.dto.UserDetails"/>
        
    </session-factory>
</hibernate-configuration>

私のテストクラスは次のようになります。

package org.mark.dto;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.mark.usr.UserDetails;

public class HibernateTest {

    
     private static ServiceRegistry serviceRegistry;  
        private static SessionFactory sessionFactory;  
      
        public static void main(String[] args){  
              
      
            UserDetails user= new UserDetails();  
                user.setUserId(1);  
                user.setUserName("Test");  
            System.out.print("Test");  
                try{  
      
                Configuration configuration = new Configuration();  
                configuration.configure("src/hibernate.cfg.xml");  
                serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();  
                sessionFactory = configuration.buildSessionFactory(serviceRegistry);  
                Session session= sessionFactory.openSession();  
                session.beginTransaction();  
                session.save(user);  
                session.getTransaction().commit();  
                }catch (HibernateException ex) {  
                    System.err.println("Failed to create sessionFactory object." + ex);  
      
                }  finally {  
                    System.out.print("Test");  
                }  
        }  

}

Hibernate 4 を使用しています。設定ファイルは src フォルダの直下にあります。検出されない理由がわかりません。

パスが configuration.configure("hibernate.cfg.xml") に変更された場合。

このエラー表示

Testlog4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" Testjava.util.ServiceConfigurationError: org.hibernate.integrator.spi.Integrator: Provider org.hibernate.search.hcore.impl.HibernateSearchIntegrator could not be instantiated: java.lang.NoClassDefFoundError: org/hibernate/search/util/logging/impl/LoggerFactory
    at java.util.ServiceLoader.fail(ServiceLoader.java:224)
    at java.util.ServiceLoader.access$100(ServiceLoader.java:181)
    at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:377)
    at java.util.ServiceLoader$1.next(ServiceLoader.java:445)
    at org.hibernate.service.classloading.internal.ClassLoaderServiceImpl.loadJavaServices(ClassLoaderServiceImpl.java:236)
    at org.hibernate.integrator.internal.IntegratorServiceImpl.<init>(IntegratorServiceImpl.java:53)
    at org.hibernate.service.internal.BootstrapServiceRegistryImpl.<init>(BootstrapServiceRegistryImpl.java:80)
    at org.hibernate.service.internal.BootstrapServiceRegistryImpl.<init>(BootstrapServiceRegistryImpl.java:57)
    at org.hibernate.service.ServiceRegistryBuilder.<init>(ServiceRegistryBuilder.java:76)
    at org.mark.dto.HibernateTest.main(HibernateTest.java:28)
Caused by: java.lang.NoClassDefFoundError: org/hibernate/search/util/logging/impl/LoggerFactory
    at org.hibernate.search.hcore.impl.HibernateSearchIntegrator.<clinit>(HibernateSearchIntegrator.java:49)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at java.lang.Class.newInstance(Class.java:374)
    at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:373)
    ... 7 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.search.util.logging.impl.LoggerFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 14 more
 

使用する瓶: ここに画像の説明を入力

4

2 に答える 2

2

最終的に、ファイルが IDE のどこにあるかは問題ではありません。重要なのは、実行時にファイルが最終バンドル内のどこにあるかだけです (おそらく、あなたの場合は生成された jar)。

したがって、既に提供した情報から推測すると、src/フォルダーは実行されたバンドル (jar) のルートになるはずです。このように、 のようhibernate.cfg.xmlsrc/、実行時に (jar の) ルートにある必要があります。言い換えると:

それ以外の:

configuration.configure("src/hibernate.cfg.xml");   

使用する:

configuration.configure("hibernate.cfg.xml");  

アップデート:

エラーの場合:

Caused by: java.lang.ClassNotFoundException: org.hibernate.search.util.logging.impl.LoggerFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    ...

org.hibernate.search.util.logging.impl.LoggerFactoryクラスがクラスパスにないことがわかります。既に持っている jar から判断すると、欠けているものは次のリンクにあります: https://repository.jboss.org/nexus/content/groups/public/org/hibernate/hibernate-search-engine/4.4.0. CR1/hibernate-search-engine-4.4.0.CR1.jar

于 2013-10-12T00:13:50.463 に答える
0

hibernateConfig File 引数を取る configure(File configFile) メソッドを使用して、別のディレクトリ (必ずしもクラスパスではない) から hibernate.cfg.xml をロードできます。(注、休止状態 4.3.7 を使用しています)

利点は、war ファイルにはアクセスできないが、メンテナンスなどのために別のディレクトリにある hibernate ファイルにアクセスできる場合です。

このような:


String hibernatePropsFilePath = "/etc/configs/hibernate.cfg.xml";
File hibernatePropsFile = new File(hibernatePropsFilePath);

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

StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());

ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();

SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

于 2014-12-27T10:18:55.367 に答える