Java Hibernate-ServiceRegistryBuilder
我只是想学习Hibernate(最终版本4),但在创建会话工厂时遇到了一个问题。以下是一些与此问题相关的代码:Java Hibernate-ServiceRegistryBuilder,java,hibernate,hibernate.cfg.xml,Java,Hibernate,Hibernate.cfg.xml,我只是想学习Hibernate(最终版本4),但在创建会话工厂时遇到了一个问题。以下是一些与此问题相关的代码: 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/hibe
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>
现在,问题似乎是创建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)
运行:
2011年12月27日12:51:12 PM org.hibernate.Version日志版本
信息:hh000412:Hibernate核心{4.0.0.Final}
2011年12月27日中午12:51:12 org.hibernate.cfg.Environment
信息:HH000206:找不到hibernate.properties
2011年12月27日中午12:51:12 org.hibernate.cfg.Environment buildBytecodeProvider
信息:HH000021:字节码提供程序名称:javassist
初始SessionFactory创建失败。org.hibernate.internal.util.config.ConfigurationException:无法在资源hibernate.cfg.xml的第14行和第26列执行解组。消息:cvc elt.1:找不到元素“hibernate配置”的声明。
线程“main”java.lang.ExceptionInInitializeError中出现异常
位于com.fitterblog.hibernate.HibernateUtil.buildSessionFactory(HibernateUtil.java:33)
在com.fitterblog.hibernate.HibernateUtil.(HibernateUtil.java:18)
位于com.fitterblog.objects.Article.list(Article.java:31)
main.main(main.java:20)
原因:org.hibernate.internal.util.config.ConfigurationException:无法在资源hibernate.cfg.xml的第14行和第26列执行解组。消息:cvc elt.1:找不到元素“hibernate配置”的声明。
位于org.hibernate.service.internal.JaxbProcessor.unmarshal(JaxbProcessor.java:120)
位于org.hibernate.service.internal.JaxbProcessor.unmarshal(JaxbProcessor.java:69)
位于org.hibernate.service.ServiceRegistryBuilder.configure(ServiceRegistryBuilder.java:162)
位于org.hibernate.service.ServiceRegistryBuilder.configure(ServiceRegistryBuilder.java:147)
位于com.fitterblog.hibernate.HibernateUtil.buildSessionFactory(HibernateUtil.java:23)
... 3个以上
原因:javax.xml.bind.UnmarshalException
-除此之外:
[org.xml.sax.SAXParseException;行号:14;列号:26;cvc elt.1:找不到元素“hibernate配置”的声明。]
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:419)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:356)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:326)
位于org.hibernate.service.internal.JaxbProcessor.unmarshal(JaxbProcessor.java:108)
... 还有7个
原因:org.xml.sax.saxpasseeption;行号:14;栏目号:26;cvc elt.1:找不到元素“hibernate配置”的声明。
位于com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
位于com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134)
位于com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:437)
请访问com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
位于com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:325)
位于com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handlestarelement(XMLSchemaValidator.java:1897)
位于com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:737)
位于com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.startElement(ValidatorHandlerImpl.java:564)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:86)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:60)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXStreamConnector.handlestarelement(StAXStreamConnector.java:232)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:166)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:354)
... 9更多
Java结果:1
生成成功(总时间:7秒)
我该如何解决这个问题?我自己似乎找不到解决方案。这可能只是吹毛求疵,但请尝试用以下内容替换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">
以下是配置中已弃用的方法,该方法仍然有效。它正在做很多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 );
}
正如中所回答的,创建SessionFactory的新方法还不起作用。它将在Hibernate 4.1中准备好。下面是它如何与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>
......
其余配置保持不变我在尝试使用Hibernate 4.1.6时遇到了类似的问题 以中的一个示例为基础,我让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文件:
<?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>
...
也许你可以调整它来为你工作?//hibernate 4构建会话工厂方式 电子邮件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();
//测试正常从4.3.0开始,甚至ServiceRegistryBuilder也被弃用。这就是你想要做的
Configuration cfg=new Configuration().configure();
StandardServiceRegistryBuilder builder= new StandardServiceRegistryBuilder().applySettings(
cfg.getProperties());
SessionFactory factory= cfg.buildSessionFactory(builder.build());
而且您还必须导入org.hib
Configuration cfg=new Configuration().configure();
StandardServiceRegistryBuilder builder= new StandardServiceRegistryBuilder().applySettings(
cfg.getProperties());
SessionFactory factory= cfg.buildSessionFactory(builder.build());
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();
........
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)