2011-12-27 6 views
15

Sto solo cercando di imparare Hibernate (versione 4 final) ma ho un problema quando provo a creare la factory di sessione. Ecco il codice relativo al 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; 
    } 
} 


Ora, quello che sembra essere il problema sta creando ServiceRegistryBuilder. Quando il codice di esecuzione arriva a quel punto, mi dà il seguente errore:

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'. 



piena log degli errori:

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) 


Come posso risolvere questo problema? Non riesco a trovare una soluzione da solo.

+0

Per ora, sto solo utilizzando la seguente per generare il SessionFactory : "new AnnotationConfiguration(). configure(). buildSessionFactory();" Funziona, tuttavia è privato, quindi mi piacerebbe evitare di usarlo se possibile. – Fittersman

risposta

0

Potrebbe essere solo fare i difficili, ma si prega di provare a sostituire la dichiarazione DOCTYPE in hibernate.cfg.xml con questo:

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

Inoltre, dichiarano un nome per la sessione in fabbrica:

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

Grazie per la risposta, ma questo non sembrava fare nulla per me. Altre idee? – Fittersman

+0

Bene, il log indica un errore in 'hibernate.cfg.xml', ma da qui sembra tutto a posto. Forse un problema con la codifica del file? assicurati che sia effettivamente UTF-8 –

+0

Non ne sono sicuro, sto iniziando a chiedermi se c'è un bug lì da qualche parte, perché dopo aver letto online per un po 'è l'impressione che sto ottenendo. Per ora, seguirò semplicemente il vecchio modo di ottenere la fabbrica della sessione. Ci riproverò più tardi per usare il nuovo modo poiché non sembra che qualcuno qui abbia una risposta tristemente :( – Fittersman

0

Ecco il metodo deprecato da Configuration che funziona ancora. Sta facendo un sacco di impostazioni specifiche di ibernazione che gli utenti in letargo non vorrebbero davvero fare. Cose come proprietà di pulizia e copia da un oggetto a un altro. Ho anche cercato un esempio funzionante di configurazione di Hibernate per Hibernate 4 che non utilizza il metodo buildSessionFactory() deprecato e non è stato possibile trovarne uno finora. Credo che l'intento sia di deprecare completamente la configurazione.

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

Ecco come funziona 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> 

resto della configurazione rimane stesso

4

ho incontrato problemi simili che cercano di usare Hibernate 4.1.6.

costruzione su un esempio da RoseIndia.net, ho ottenuto ServiceRegistryBuilder a lavorare in questo modo:

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

Il mio file hibernate.cfg.xml utilizza il vecchio file DTD; Non sono stato in grado di ottenere il nuovo file XSD di essere riconosciuto da 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> 

Forse si può adattare questo a lavorare per voi?

0

// ibernazione 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(); 

// test è ok

7

A partire dal 4.3.0, anche ServiceRegistryBuilder è stato sconsigliato. Questo è come si vorrebbe andare a questo proposito

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

E anche che avrebbe dovuto importare org.hibernate.boot.registry.StandardServiceRegistryBuilder invece di org.hibernate.service.ServiceRegistryBuilder

17

I metodi buildSessionFactory e ServiceRegistryBuilder in Hibernate 4.3.4 sono deprecati.

Il codice giusto è qui.

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

per l'errore di seguito:

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) 

dovremmo collocare la hibernate.cfg.xml nella cartella src ..

+0

È una buona pratica quando spieghi la tua risposta un po 'semplice non è così utile –