Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate + JBoss


Автор: Xpoft 20.7.2006, 22:59
Никак не получается заставить работать Hibernate через JBoss. Hibernate 3.0, JBoss 4.0.4.
Сам EAR отлично деплоится, и DataSource жив, EJB компоненты тоже работают.

orgs.har:
META-INF/hibernate-service.xml
Orgs.class
Orgs.hbm.xml

hibernate-service.xml:
Код

<server>
    <mbean code="org.jboss.hibernate.jmx.Hibernate" name="jboss.har:service=Hibernate">
        <attribute name="DatasourceName">java:/jdbc/PostgresDS</attribute>
        <attribute name="Dialect">org.hibernate.dialect.PostgreSQLDialect</attribute>
        <attribute name="SessionFactoryName">java:/hibernate/SessionFactory</attribute>
        <attribute name="CacheProviderClass">org.hibernate.cache.HashtableCacheProvider</attribute>
        <attribute name="ShowSqlEnabled">true</attribute>
    </mbean>
</server>

Test.ear:
META-INF/application.xml
META-INF/jboss-app.xml
orgs.har

jboss-app.xml:
Код

<!DOCTYPE jboss-app PUBLIC
          "-//JBoss//DTD J2EE Application 1.4//EN"
          "http://www.jboss.org/j2ee/dtd/jboss-app_4_0.dtd">
<jboss-app>
    <module>
        <har>orgs.har</har>
    </module>
</jboss-app>

Во время деплоймента в JBoss смущает запись в логах:
Код

23:35:40,825 INFO  [SessionFactoryImpl] building session factory
23:35:40,825 INFO  [SessionFactoryObjectFactory] Not binding factory to JNDI, no JNDI name configured
23:35:40,825 INFO  [NamingHelper] JNDI InitialContext properties:{}
23:35:40,840 INFO  [Hibernate] SessionFactory successfully built and bound intoJNDI [java:/hibernate/SessionFactory]

Если в клиенте попробывать найти запись в JNDI, то ловится exception:
Код

javax.naming.NameNotFoundException: hibernate not bound

Код

Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY,
    "org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL,
    "localhost:1099");      
try
{
    InitialContext ctx = new InitialContext(env);
    ctx.lookup("java:/hibernate/SessionFactory")
}
catch (NamingException e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

В документации по Hibernate в JBoss примерно такой пример (не считая свойств контекста).
В инете нашёл вариант, где в файле hibernate-service.xml значение аттрибута SessionFactoryName задаётся без "java:/", т.е.
Код

<server>
...
        <attribute name="SessionFactoryName">hibernate/SessionFactory</attribute>
...
</server>

Но при таком варианте ctx.lookup вообще ругается на отсутствие класса org/apache/commons/logging/LogFactory.
Код

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

Добавляем пакет commons-logging, раз так нужно.
Теперь выдаётся более осмысленная ошибка:
Код

20.07.2006 23:44:37 org.hibernate.impl.SessionFactoryObjectFactory getInstance
WARNING: Not found: 8a739a910c8d795d010c8d79adb20001

, где "8a739a910c8d795d010c8d79adb20001" этот как раз кусочек смущающего лога (виден при DEBUG детализации лога)
Код

23:46:37,106 DEBUG [SessionFactoryObjectFactory] registered: 8a739a910c8d795d010c8d79adb20001 (unnamed)
23:46:37,106 INFO  [SessionFactoryObjectFactory] Not binding factory to JNDI, no JNDI name configured
23:46:37,106 DEBUG [SessionFactoryImpl] instantiated session factory
23:46:37,106 DEBUG [SessionFactoryImpl] obtaining JTA TransactionManager
23:46:37,106 INFO  [NamingHelper] JNDI InitialContext properties:{}
...
23:46:37,137 DEBUG [SessionFactoryImpl] Returning a Reference to the SessionFactory
23:46:37,137 INFO  [Hibernate] SessionFactory successfully built and bound intoJNDI [hibernate/SessionFactory]

Как нормально деплоить hibernate классы в JBoss, чтобы их можно было использовать в клиентской части? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)