webentwicklung-frage-antwort-db.com.de

Überwintern - ServiceRegistryBuilder

Ich versuche gerade, Hibernate (Version 4 final) zu lernen, aber ich habe ein Problem, wenn ich versuche, die Session-Factory zu erstellen. Hier ist etwas Code, der sich auf das Problem bezieht:

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


Nun scheint das Problem das Erstellen des ServiceRegistryBuilder zu sein. Wenn die Codeausführung an diesen Punkt gelangt, wird der folgende Fehler angezeigt:

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



Vollständiges Fehlerprotokoll:

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)


Wie kann ich das beheben? Ich kann selbst keine Lösung finden.

16
Fittersman

Die Methoden buildSessionFactory und ServiceRegistryBuilder in Hibernate 4.3.4 werden nicht mehr unterstützt.

Der richtige Code ist hier.

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

Seit 4.3.0 wurde auch ServiceRegistryBuilder nicht mehr unterstützt. So möchten Sie es tun 

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

Und auch Sie müssten org.hibernate.boot.registry.StandardServiceRegistryBuilder anstelle von org.hibernate.service.ServiceRegistryBuilder importieren

9
idok

So funktioniert es mit 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>

restliche Konfiguration bleibt gleich

5
Keerthi

Ich hatte ähnliche Probleme beim Versuch, Hibernate 4.1.6 zu verwenden.

Aufbauend auf einem Beispiel aus RoseIndia.net habe ich ServiceRegistryBuilder so arbeiten lassen:

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

Meine hibernate.cfg.xml-Datei verwendet die alte DTD-Datei. Ich konnte die neue XSD-Datei nicht von Hibernate 4.1.6 erkennen lassen:

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

Vielleicht können Sie dies anpassen, um für Sie zu arbeiten?

5

für den untenstehenden Fehler:

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)

wir sollten die hibernate.cfg.xml im src-Ordner ablegen.

1
perky

// Ruhezustand 4 构建 sessionFactory 方式 E-Mail [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 ist ok

0
user2473488

Wie in Hibernate 4.0.0 beantwortet. CR4: org.hibernate.internal.util.config.ConfigurationException mit hibernate.cfg.xml , die neue Methode zum Erstellen von SessionFactories funktioniert noch nicht. Es wird in Hibernate 4.1 fertig sein.

0
Thiago Chaves

Hier ist die veraltete Methode von Configuration, die noch funktioniert. Es wird eine Menge von Hibernat-spezifischen Setups vorgenommen, die Benutzer im Hibernat-Modus eigentlich nicht möchten. Dinge wie das Verändern von Eigenschaften und das Kopieren von Objekten von Objekt zu Objekt. Ich habe auch nach einem funktionierenden Beispiel für die Hibernate-Konfiguration für Hibernate 4 gesucht, das nicht die veraltete buildSessionFactory () -Methode verwendet und bisher keine gefunden hat. Ich glaube, dass die Absicht ist, die Konfiguration vollständig zu verweigern.

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

Es kann sich nur um eine Auswahl handeln, aber versuchen Sie bitte, die DOCTYPE-Deklaration in hibernate.cfg.xml durch Folgendes zu ersetzen:

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

Geben Sie auch einen Namen für die Session-Factory an:

<session-factory name="Java:hibernate/SessionFactory">
0
Óscar López