2011-12-27 24 views
15

我只是想学习Hibernate的(4最终版),但我想创建会话工厂时,有一个问题。下面是与问题有关的一些代码:

的hibernate.cfg.xml:休眠 - 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; 
    } 
} 


现在,似乎是什么问题是创建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 <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) 


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

+0

现在,我只是用下面生成的SessionFactory :“new AnnotationConfiguration()。configure()。buildSessionFactory();” 它的工作原理,但它是depricated,所以我想尽可能避免使用它。 – Fittersman 2011-12-27 11:48:32

回答

0

这可能只是吹毛求疵,但请尝试用这种替代在hibernate.cfg.xml DOCTYPE声明:

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

另外,会议工厂宣布了一个名字:

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

感谢您的回复,但这似乎并没有为我做任何事情。任何其他想法? – Fittersman 2011-12-27 11:47:48

+0

那么,日志表明'hibernate.cfg.xml'中有错误,但从这里看起来很好。也许这个文件的编码有问题?请确保它确实是UTF-8 – 2011-12-27 13:58:01

+0

我不太确定,我开始怀疑是否有某个地方存在一个错误,因为在线阅读了一段时间后,我得到了这样的印象。就目前而言,我只会坚持以前获得会话工厂的方式。我会稍后再尝试使用新的方式,因为它看起来不像任何人在这里有一个可悲的答案:( – Fittersman 2011-12-28 12:18:42

0

以下是来自配置的不推荐使用的方法,仍然有效。它正在做很多hibernate特定的设置,休眠用户不会真的想这样做。事物就像非常有趣的属性并将它们从一个对象复制到另一个对象。我也一直在寻找一个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); 
} 
5

这里是如何与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> 

其余配置仍然相同

4

我遇到试图使用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文件;我一直没能得到新的XSD文件由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> 

也许你能适应这个为你工作?

0

//冬眠4构建SessionFactory的方式邮箱[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(); 

//测试成功

7

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

17

方法buildSessionFactoryServiceRegistryBuilder在Hibernate中4.3.4已被弃用。

正确的代码在这里。

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

为下面的错误:

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) 

我们应该把在src文件夹中的hibernate.cfg.xml ..

+0

它是一个很好的做法,当你解释你的答案有点简单的一个lners不是那种有用的 – 2015-10-09 05:50:42