Hibernate – ServiceRegistryBuilder

我只是想学习Hibernate(最终版本4)但是在尝试创建会话工厂时我遇到了问题。 以下是与此问题相关的一些代码:

hibernate.cfg.xml中:

    jdbc:mysql://localhost/fitterblog root  com.mysql.jdbc.Driver 1 org.hibernate.dialect.MySQL5InnoDBDialect org.hibernate.transaction.JDBCTransactionFactory thread true <!--   -->   

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

现在,似乎问题是创建ServiceRegistryBuilder。 当代码执行到达那一点时,它会给我以下错误:

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

完整错误日志:

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

我该如何解决? 我自己似乎无法找到解决方案。

不推荐使用Hibernate 4.3.4中的方法buildSessionFactoryServiceRegistryBuilder

正确的代码在这里。

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

从4.3.0开始,甚至ServiceRegistryBuilder也被弃用了。 这就是你想要的方式

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

而且你必须导入org.hibernate.boot.registry.StandardServiceRegistryBuilder而不是org.hibernate.service.ServiceRegistryBuilder

以下是hibernate 4.x的工作原理

    ......   

其余配置保持不变

我在尝试使用Hibernate 4.1.6时遇到了类似的问题。

基于RoseIndia.net的一个例子,我让ServiceRegistryBuilder像这样工作:

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

我的hibernate.cfg.xml文件使用旧的DTD文件; 我无法让Hibernate 4.1.6识别新的XSD文件:

     ...   

也许你可以适应这个为你工作?

对于以下错误:

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

我们应该将hibernate.cfg.xml放在src文件夹中。

它可能只是挑剔,但请尝试用以下方法替换hibernate.cfg.xml中的DOCTYPE声明:

  

另外,声明会话工厂的名称:

  

以下是Configuration中不推荐使用的方法。 它正在做很多hibernate特定的设置,hibernate用户不会真的想做。 像通知属性和将它们从一个对象复制到另一个对象的事情。 我一直在寻找Hibernate 4的Hibernate配置的一个工作示例,该配置不使用已弃用的buildSessionFactory()方法,到目前为止无法找到它。 我认为其目的是完全弃用配置。

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

正如hibernate 4.0.0中所回答的那样。 使用hibernate.cfg.xml的CR4:org.hibernate.internal.util.config.ConfigurationException ,创建SessionFactories的新方法还不行。 它将在Hibernate 4.1中准备就绪。

// hibernate 4构建sessionFactory方式电子邮件563143188@qq.com

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

//测试没问题