I'm just trying to learn Hibernate (version 4 final) but I have a problem when trying to create the session factory. Here is some code related to the problem:
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;
}
}
Now, what seems to be the problem is creating the ServiceRegistryBuilder. When the code execution gets to that point, it gives me the following 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'.
full error log:
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)
How do I fix this? I can't seem to find a solution myself.
The methods buildSessionFactory and ServiceRegistryBuilder in Hibernate 4.3.4 are deprecated.
The right code is here.
Here is the deprecated method from Configuration that still works. It is doing a lot of hibernate specific setup that hibernate users wouldn't really want to do. Things like veryifying properties and copying them from one object to another. I have also been looking for a working example of Hibernate configuration for Hibernate 4 that does not use the deprecated buildSessionFactory() method and have been unable to find one so far. I believe that the intent is to deprecate Configuration entirely.
for the below error :
we should place the hibernate.cfg.xml in src folder..
It might be just nitpicking, but please try replacing the DOCTYPE declaration in hibernate.cfg.xml with this:
Also, declare a name for the session-factory:
// hibernate 4构建sessionFactory方式 email 563143188@qq.com
// test is ok
As answered in hibernate 4.0.0. CR4: org.hibernate.internal.util.config.ConfigurationException with hibernate.cfg.xml, the new way of creating SessionFactories doesn't work yet. It will be ready in Hibernate 4.1.