2011-12-27 7 views
15

Po prostu próbuję uczyć się Hibernate (wersja 4 final), ale mam problem podczas próby utworzenia fabryki sesji. Oto kod związany z problemem:

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; 
    } 
} 


Teraz, co wydaje się być problemem jest utworzenie ServiceRegistryBuilder. Gdy wykonanie kodu dostaje się do tego punktu, to daje mi następujący błąd:

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



pełny raport o błędzie:

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) 


Jak mogę rozwiązać ten problem? Nie mogę znaleźć rozwiązania samodzielnie.

+0

Na razie jestem po prostu za pomocą następujących czynności, aby wygenerować SessionFactory : "new AnnotationConfiguration(). configure(). buildSessionFactory();" Działa, ale jest zdeponowana, więc nie chcę go używać, jeśli to możliwe. – Fittersman

Odpowiedz

0

To może być tylko nitpicking, ale proszę spróbować wymienić deklarację DOCTYPE w hibernate.cfg.xml z tym:

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

także zadeklarować nazwę sesji fabryce:

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

Dziękuję za odpowiedź, ale nic nie zrobiło dla mnie. Jakieś inne pomysły? – Fittersman

+0

Cóż, dziennik wskazuje na błąd w pliku 'hibernate.cfg.xml', ale tutaj wygląda dobrze. Może problem z kodowaniem pliku? Upewnij się, że to naprawdę UTF-8 –

+0

Nie jestem pewien, zaczynam się zastanawiać, czy gdzieś tam jest jakiś błąd, ponieważ po przeczytaniu przez chwilę, to jest wrażenie, które dostaję. Na razie pozostanę przy starym sposobie zdobycia fabryki sesji. Spróbuję jeszcze raz później, aby skorzystać z nowej metody, ponieważ nie wygląda to tak, jakby ktoś tutaj miał smutną odpowiedź :( – Fittersman

0

Oto nieaktualna metoda z konfiguracji, która wciąż działa. Wykonuje wiele ustawień hibernacji, których użytkownicy hibernacji nie chcą robić naprawdę. Rzeczy takie jak właściwości upraszczające i kopiowanie ich z jednego obiektu do drugiego. Szukałem również działającego przykładu konfiguracji Hibernate dla Hibernate 4, która nie używa przestarzałej metody buildSessionFactory() i nie udało się jej znaleźć. Uważam, że celem jest całkowita rezygnacja z konfiguracji.

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

Oto jak to działa z hibernacji 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> 

resztę konfiguracji pozostaje sam

4

natknąłem się na podobne problemy próbuje użyć Hibernacja 4.1.6.

Opierając się na przykład z RoseIndia.net, mam ServiceRegistryBuilder działa tak:

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

Mój plik hibernate.cfg.xml wykorzystuje stary plik DTD; Nie udało się uzyskać nowy plik XSD być uznawane przez 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> 

Być może można dostosować to do pracy dla Ciebie?

0

// hibernacji 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 jest ok

7

Od 4.3.0, nawet ServiceRegistryBuilder została zaniechana. To w jaki sposób chcesz zabrać

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

A także trzeba by importować org.hibernate.boot.registry.StandardServiceRegistryBuilder zamiast org.hibernate.service.ServiceRegistryBuilder

17

Metody buildSessionFactory i ServiceRegistryBuilder w Hibernate 4.3.4 są przestarzałe.

Właściwy kod jest tutaj.

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

na poniższy błąd:

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) 

powinniśmy umieścić w folderze src hibernate.cfg.xml ..

+0

Jest to dobra praktyka, gdy wyjaśnisz swoją odpowiedź nieco prostszą, ale nie jest to przydatne –