java hibernate hibernate.cfg.xml

java - Hibernate-ServiceRegistryBuilder



hibernate.cfg.xml (9)

// hibernate 4 构建 sessionFactory 方式 email [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();

// la prueba está bien

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

hibernate.cfg.xml:

<?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 del 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 errores 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 a mí mismo.


A partir de 4.3.0, incluso ServiceRegistryBuilder ha quedado en desuso. Así es como querrías hacerlo.

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 lugar de org.hibernate.service.ServiceRegistryBuilder


Aquí está el método en desuso de la configuración que aún funciona. Está haciendo una gran cantidad de configuraciones específicas de hibernación que los usuarios de hibernación no querrían hacer. Cosas como propiedades muy diversas 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 use el método buildSessionFactory () en desuso y no he podido encontrar uno hasta ahora. Creo que la intención es despreciar 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 ); }


Así es como funciona con hibernate 4.x

<?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>

El resto de la configuración permanece igual.



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(); ........


Me encontré con problemas similares al tratar de usar Hibernate 4.1.6.

A partir de un ejemplo de RoseIndia.net , conseguí que ServiceRegistryBuilder funcionara así:

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 usa el archivo DTD antiguo; No he podido conseguir que el nuevo archivo XSD sea 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>

¿Quizás puedas adaptar esto para que funcione para ti?


Puede que solo sea un error, pero 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 fábrica de sesiones:

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


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 el hibernate.cfg.xml en la carpeta src ...