2011-12-27 23 views
15

Estoy tratando de aprender Hibernate (versión 4 final) pero tengo un problema al intentar crear la fábrica de la sesión. Aquí hay un código relacionado con el problema:

hibernate.cfg.xml:Hibernate - ServiceRegistryBuilder

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory> 
    <property name="connection.url">jdbc:mysql://localhost/fitterblog</property> 
    <property name="connection.username">root</property> 
    <property name="connection.password"></property> 
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 

    <property name="connection.pool_size">1</property> 
    <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> 
    <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> 
    <property name="current_session_context_class">thread</property> 
    <property name="show_sql">true</property> 

    <!--<mapping class="com.fitterblog.objects.Article"/> 
    <mapping class="com.fitterblog.objects.Nav"/> 
    <mapping class="com.fitterblog.objects.Tag"/> 
    <mapping class="com.fitterblog.objects.User"/>--> 

</session-factory> 
</hibernate-configuration> 


HibernateUtil.java:

public class HibernateUtil { 

    private static final SessionFactory sessionFactory = buildSessionFactory(); 

    private static SessionFactory buildSessionFactory() { 
     try { 
      // Create the SessionFactory from hibernate.cfg.xml 

      ServiceRegistryBuilder srb = new ServiceRegistryBuilder(); 

      //NOTE: THIS IS WHERE MY PROGRAM DIES!! 
      srb = srb.configure(); 

      ServiceRegistry sr = srb.buildServiceRegistry(); 
      MetadataSources mds = new MetadataSources(sr); 
      /*mds.addAnnotatedClass(com.fitterblog.objects.Article.class); 
      mds.addAnnotatedClass(com.fitterblog.objects.Nav.class); 
      mds.addAnnotatedClass(com.fitterblog.objects.Tag.class); 
      mds.addAnnotatedClass(com.fitterblog.objects.User.class);*/ 
      return mds.buildMetadata().buildSessionFactory(); 
     } catch (Throwable ex) { 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 
} 


Ahora, lo que parece ser el problema es crear el ServiceRegistryBuilder. Cuando la ejecución de código llega a ese punto, me da el siguiente error:

org.hibernate.internal.util.config.ConfigurationException: 
Unable to perform unmarshalling at line number 14 and 
column 26 in RESOURCE hibernate.cfg.xml. Message: cvc-elt.1: 
Cannot find the declaration of element 'hibernate-configuration'. 



registro de error completo:

run: 
Dec 27, 2011 12:51:12 PM org.hibernate.Version logVersion 
INFO: HHH000412: Hibernate Core {4.0.0.Final} 
Dec 27, 2011 12:51:12 PM org.hibernate.cfg.Environment <clinit> 
INFO: HHH000206: hibernate.properties not found 
Dec 27, 2011 12:51:12 PM org.hibernate.cfg.Environment buildBytecodeProvider 
INFO: HHH000021: Bytecode provider name : javassist 
Initial SessionFactory creation failed. org.hibernate.internal.util.config.ConfigurationException: Unable to perform unmarshalling at line number 14 and column 26 in RESOURCE hibernate.cfg.xml. Message: cvc-elt.1: Cannot find the declaration of element 'hibernate-configuration'. 
Exception in thread "main" java.lang.ExceptionInInitializerError 
at com.fitterblog.hibernate.HibernateUtil.buildSessionFactory(HibernateUtil.java:33) 
at com.fitterblog.hibernate.HibernateUtil.<clinit>(HibernateUtil.java:18) 
at com.fitterblog.objects.Article.list(Article.java:31) 
at main.main(main.java:20) 
Caused by: org.hibernate.internal.util.config.ConfigurationException: Unable to perform unmarshalling at line number 14 and column 26 in RESOURCE hibernate.cfg.xml. Message: cvc-elt.1: Cannot find the declaration of element 'hibernate-configuration'. 
at org.hibernate.service.internal.JaxbProcessor.unmarshal(JaxbProcessor.java:120) 
at org.hibernate.service.internal.JaxbProcessor.unmarshal(JaxbProcessor.java:69) 
at org.hibernate.service.ServiceRegistryBuilder.configure(ServiceRegistryBuilder.java:162) 
at org.hibernate.service.ServiceRegistryBuilder.configure(ServiceRegistryBuilder.java:147) 
at com.fitterblog.hibernate.HibernateUtil.buildSessionFactory(HibernateUtil.java:23) 
... 3 more 
Caused by: javax.xml.bind.UnmarshalException 
- with linked exception: 
[org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 26; cvc-elt.1: Cannot find the declaration of element 'hibernate-configuration'.] 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:419) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:356) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:326) 
at org.hibernate.service.internal.JaxbProcessor.unmarshal(JaxbProcessor.java:108) 
... 7 more 
Caused by: org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 26; cvc-elt.1:  Cannot find the declaration of element 'hibernate-configuration'. 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198) 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134) 
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:437) 
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368) 
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:325) 
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1897) 
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:737) 
at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.startElement(ValidatorHandlerImpl.java:564) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:86) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:60) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:232) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:166) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:354) 
... 9 more 
Java Result: 1 
BUILD SUCCESSFUL (total time: 7 seconds) 


¿Cómo puedo solucionar esto? Parece que no puedo encontrar una solución yo mismo.

+0

Por ahora, sólo estoy usando el siguiente para generar la SessionFactory : "nueva AnnotationConfiguration(). configure(). buildSessionFactory();" Funciona, sin embargo, está privado, así que me gustaría evitar usarlo si es posible. – Fittersman

Respuesta

0

Podría ser sólo acaba aburriendo, pero por favor, intente reemplazar la declaración DOCTYPE en hibernate.cfg.xml con esto:

<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD//EN" 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

Además, declara un nombre para la sesión de fábrica:

<session-factory name="java:hibernate/SessionFactory"> 
+0

Gracias por la respuesta, pero eso no pareció hacer nada por mí. ¿Alguna otra idea? – Fittersman

+0

Bueno, el registro indica un error en 'hibernate.cfg.xml', pero se ve bien desde aquí. Tal vez un problema con la codificación del archivo? asegúrese de que sea de hecho UTF-8 –

+0

No estoy muy seguro, estoy empezando a preguntarme si hay algún error allí, porque después de leer en línea por un tiempo, esa es la impresión que estoy recibiendo. Por ahora, me quedaré con la vieja forma de obtener la fábrica de sesiones. Lo intentaré de nuevo más tarde para utilizar la nueva forma, ya que no parece que nadie aquí tenga una respuesta lamentablemente :( – Fittersman

0

Aquí está el método obsoleto de Configuración que aún funciona. Está haciendo una gran cantidad de configuración específica de hibernación que los usuarios de hibernación en realidad no querrían hacer. Cosas como propiedades de mejora y copiarlas de un objeto a otro. También he estado buscando un ejemplo funcional de la configuración de Hibernate para Hibernate 4 que no utiliza el método buildSessionFactory() en desuso y no he podido encontrar uno hasta el momento. Creo que la intención es desaprobar la configuración por completo.

public SessionFactory buildSessionFactory() throws HibernateException { 
    Environment.verifyProperties(properties); 
    ConfigurationHelper.resolvePlaceHolders(properties); 
    final ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() 
      .applySettings(properties) 
      .buildServiceRegistry(); 
    setSessionFactoryObserver(
      new SessionFactoryObserver() { 
       @Override 
       public void sessionFactoryCreated(SessionFactory factory) { 
       } 

       @Override 
       public void sessionFactoryClosed(SessionFactory factory) { 
        ((StandardServiceRegistryImpl) serviceRegistry).destroy(); 
       } 
      } 
    ); 
    return buildSessionFactory(serviceRegistry); 
} 
5

Aquí es cómo funciona con 4.x de hibernación

<?xml version='1.0' encoding='utf-8'?> 
<hibernate-configuration xmlns="http://www.hibernate.org/xsd/hibernate-configuration"> 
    <session-factory name="java:hibernate/SessionFactory"><!-- Name is Optional --> 
...... 
</session-factory> 
</hibernate-configuration> 

resto de la configuración permanece igual

4

me encontré con problemas similares tratando de utilizar Hibernate 4.1.6.

Sobre la base de un ejemplo de RoseIndia.net, tengo ServiceRegistryBuilder trabajando de esta manera:

Configuration config = new Configuration(); 
config.configure(); 
ServiceRegistryBuilder srBuilder = new ServiceRegistryBuilder(); 
srBuilder.applySettings(config.getProperties()); 
ServiceRegistry serviceRegistry = srBuilder.buildServiceRegistry(); 
SessionFactory factory = config.buildSessionFactory(serviceRegistry); 

Mi archivo hibernate.cfg.xml utiliza el archivo DTD de edad; No he sido capaz de obtener el nuevo archivo XSD para ser reconocido por Hibernate 4.1.6:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     ... 
    </session-factory> 
</hibernate-configuration> 

Tal vez se puede adaptar esto funcione para usted?

0

// hibernación 4 构建 correo electrónico sessionFactory 方式 [email protected]

Configuration cfg = new Configuration() 
      .configure("hibernate.cfg.xml"); 

    SessionFactory sf = cfg.buildSessionFactory(new ServiceRegistryBuilder() 
      .applySettings(cfg.getProperties()).build()); 
    //build() return buildServiceRegistry 
    Session s = sf.openSession(); 

// prueba es correcta

7

A partir de 4.3.0, incluso ServiceRegistryBuilder ya no se utiliza. Esta es la forma en que le gustaría ir sobre ella

Configuration cfg=new Configuration().configure(); 
StandardServiceRegistryBuilder builder= new StandardServiceRegistryBuilder().applySettings(
      cfg.getProperties()); 
SessionFactory factory= cfg.buildSessionFactory(builder.build()); 

Y también tendría que importar org.hibernate.boot.registry.StandardServiceRegistryBuilder en lugar de org.hibernate.service.ServiceRegistryBuilder

17

Los métodos buildSessionFactory y ServiceRegistryBuilder en Hibernate 4.3.4 están en desuso.

El código correcto está aquí.

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.service.ServiceRegistry; 
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 


..... 

    Configuration conf = new Configuration() 
       .configure(); 


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


    SessionFactory sf = conf.buildSessionFactory(sr); 

    Session session = sf.openSession(); 

    session.beginTransaction(); 


    YourDominClass ydc = new YourDominClass(); 

    ydc.setSomething("abcdefg"); 

    session.save(ydc); 

    session.getTransaction().commit(); 

    session.close(); 

    sf.close(); 
      ........ 
1

para el siguiente error:

Oct 09, 2015 12:29:53 AM org.hibernate.Version logVersion 
INFO: HHH000412: Hibernate Core {5.0.2.Final} 
Oct 09, 2015 12:29:53 AM org.hibernate.cfg.Environment <clinit> 
INFO: HHH000206: hibernate.properties not found 
Oct 09, 2015 12:29:53 AM org.hibernate.cfg.Environment buildBytecodeProvider 
INFO: HHH000021: Bytecode provider name : javassist 
Exception in thread "main" org.hibernate.internal.util.config.ConfigurationException: Could not locate cfg.xml resource [hibernate.cfg.xml] 
    at org.hibernate.boot.cfgxml.internal.ConfigLoader.loadConfigXmlResource(ConfigLoader.java:53) 
    at org.hibernate.boot.registry.StandardServiceRegistryBuilder.configure(StandardServiceRegistryBuilder.java:163) 
    at org.hibernate.cfg.Configuration.configure(Configuration.java:259) 
    at org.hibernate.cfg.Configuration.configure(Configuration.java:245) 
    at org.hibernate.ClientResource.ClientTest.main(ClientTest.java:17) 

deberíamos colocar la hibernate.cfg.xml de la carpeta src ..

+0

Es una buena práctica cuando explicas tu respuesta de una manera un tanto simple que no son útiles. –