私はHibernate(バージョン4 final)を学習しようとしていますが、セッションファクトリを作成しようとすると問題が発生します。これは問題に関連するいくつかのコードです:
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;
}
}
今、問題のように思われるのは、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)
どうすれば修正できますか?自分で解決策を見つけることができないようです。
Hibernate 4.3.4のメソッドbuildSessionFactoryおよびServiceRegistryBuilderは非推奨です。
正しいコードはこちらです。
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でどのように機能するかです。
<?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を使用しようとすると、同様の問題が発生しました。
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>
おそらくあなたはこれをあなたのために働くように適応させることができますか?
以下のエラーの場合:
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)
hibernate.cfg.xmlをsrcフォルダーに配置する必要があります。
// hibernate 4构建sessionFactory方式email [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();
//テストは問題ありません
hibernate 4.0.0。CR4:org.hibernate.internal.util.config.ConfigurationException with hibernate.cfg.xml で回答されているように、SessionFactoriesを作成する新しい方法はまだ機能していません。 Hibernate 4.1で使用できるようになります。
以下は、まだ機能するConfigurationの非推奨メソッドです。これは、休止状態のユーザーが実際に実行したくないような、休止状態に固有の多くのセットアップを実行しています。プロパティを具体化し、あるオブジェクトから別のオブジェクトにコピーするようなものです。また、非推奨のbuildSessionFactory()メソッドを使用しないHibernate 4のHibernate構成の実際の例を探していて、これまでのところ見つけられませんでした。私の意図は、構成を完全に廃止することだと思います。
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.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">