Hibernateのバージョンを3.6.8.finalから4.0.0.finalに更新したとき、次の行に廃止予定のメソッドbuildSessionFactory()
に関する警告が表示されました。
private static final SessionFactory sessionFactory =
new Configuration().configure().buildSessionFactory();
javadocは別の方法の使用を推奨しています
buildSessionFactory(ServiceRegistry serviceRegistry)
しかし ドキュメント 私は廃止予定の変種を見つけました:(
この小さな誤解で私を助けてもらえますか?
はい、それは非推奨です。 SessionFactoryを次のものに置き換えます。
In Hibernate 4.0、4.1、4.2
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
public static SessionFactory createSessionFactory() {
Configuration configuration = new Configuration();
configuration.configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
configuration.getProperties()). buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
更新日
Hibernate 4. ServiceRegistryBuilderは廃止予定です。代わりに以下を使用してください。
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
はい、それは非推奨です。 http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory ()は、代わりに見つけた他の方法を使用するように指示します( buildSessionFactory(ServiceRegistry serviceRegistry)
) - それを使ってください。
ドキュメントはリリースごとにコピーされていますが、まだ更新されていない可能性があります(リリースごとにマニュアルが書き直されるわけではありません)。したがって、Javadocを信頼してください。
この変更の詳細は、次の場所にあります。
その他の参考資料
または
public class Hbutil {
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
private static SessionFactory configureSessionFactory() throws HibernateException {
Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
public static SessionFactory getSessionFactory() {
return configureSessionFactory();
}
}
Hibernate 4.3.0で動作することが確認されたコード。 XMLファイル名パラメータを削除するか、または独自のパスをそこに提供できることに注意してください。これは他の記事と似ていますが(ただしタイプミスは修正されています)、これは正しいものです。
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
Configuration configuration = new Configuration();
configuration.configure("/com/rtw/test/hiber/hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
それはこれと同じくらい簡単です:JBossドキュメントは100%完全に手入れされていません。 JavaDocが言っていること :buildSessionFactory(ServiceRegistry serviceRegistry)
を続けてください。
異なるバージョンのドキュメンテーションの間に矛盾を見つけることは珍しいことではありません。ほとんどの開発者はドキュメントを雑用と見なしており、それを延期する傾向があります。
経験則として、javadocが1つのことを言っていて、javadoc以外の文書がそれと矛盾している場合は、javadocがより正確である可能性があります。 Javadocの「ソース」はコードと同じファイルにあるため、プログラマーはコードを変更してもjavadocを最新の状態に保つ可能性が高くなります。
@deprecated
タグの場合、javadocがより正確であることは事実上の確実性です。開発者は慎重に検討した後で物事を非難します...そして(一般的に言って)彼らはそれらを非難しません。
Hibernate 5.2以上を使っているなら、これを使うことができます。
private static StandardServiceRegistry registry;
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
try {
// Creating a registry
registry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
// Create the MetadataSources
MetadataSources sources = new MetadataSources(registry);
// Create the Metadata
Metadata metadata = sources.getMetadataBuilder().build();
// Create SessionFactory
sessionFactory = metadata.getSessionFactoryBuilder().build();
} catch (Exception e) {
e.printStackTrace();
if (registry != null) {
StandardServiceRegistryBuilder.destroy(registry);
}
}
}
return sessionFactory;
}
//To shut down
public static void shutdown() {
if (registry != null) {
StandardServiceRegistryBuilder.destroy(registry);
}
}
最新のHibernateリリースでSessionFactoryオブジェクトを作成するためのより良い方法4.3.以降は次のとおりです。
Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().
applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());
public class HibernateSessionFactory {
private static final SessionFactory sessionFactory = buildSessionFactory1();
private static SessionFactory buildSessionFactory1() {
Configuration configuration = new Configuration().configure(); // configuration
// settings
// from
// hibernate.cfg.xml
StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder();
serviceRegistryBuilder.applySettings(configuration.getProperties());
ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();
return configuration.buildSessionFactory(serviceRegistry);
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
// Close caches and connection pools
getSessionFactory().close();
}
Tested on 4.2.7 release
package com.national.software.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import com.national.software.dto.UserDetails;
public class HibernateTest {
static SessionFactory sessionFactory;
public static void main(String[] args) {
// TODO Auto-generated method stub
UserDetails user = new UserDetails();
user.setUserId(1);
user.setUserName("user1");
Configuration config = new Configuration();
config.configure();
ServiceRegistry serviceRegistry = (ServiceRegistry) new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
sessionFactory = config.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
}
}
hibernate 5.3.1
では、これを試すことができます。
ServiceRegistry standardRegistry =
new StandardServiceRegistryBuilder().configure().build();
Metadata sources = new MetadataSources(standardRegistry).addAnnotatedClass(MyEntity.class).getMetadataBuilder().build();
SessionFactory sf = sources.buildSessionFactory();
上記のbatbaatar によって作成されたメソッドを編集して、Configurationオブジェクトをパラメータとして受け取るようにしました。
public static SessionFactory createSessionFactory(Configuration configuration) {
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
factory = configuration.buildSessionFactory(serviceRegistry);
return factory;
}
私がしたメインクラスでは:
private static SessionFactory factory;
private static Configuration configuration
...
configuration = new Configuration();
configuration.configure().addAnnotatedClass(Employee.class);
// Other configurations, then
factory = createSessionFactory(configuration);
In Hibernate 4.2.2
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class Test {
public static void main(String[] args) throws Exception
{
Configuration configuration = new Configuration()
.configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
configuration.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Users users = new Users();
... ...
session.save(users);
transaction.commit();
session.close();
sessionFactory.close();
}
}
public void sampleConnection()が例外をスローする{
Configuration cfg = new Configuration().addResource("hibernate.cfg.xml").configure();
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration.buildSessionFactory(ssrb.build());
Session session = sessionFactory.openSession();
logger.debug(" connection with the database created successfuly.");
}
これは、休止状態のコアフレームワークで推奨されていない多くのAPIです。
以下のようにセッションファクトリを作成しました。
SessionFactory sessionFactory = new Configuration()。configure()。buildSessionFactory();
メソッドbuildSessionFactoryはHibernate 4リリースから非推奨となり、新しいAPIに置き換えられました。 Hibernate 4.3.0以降を使用している場合、コードは次のようになります。
構成構成= new Configuration()。configure();
StandardServiceRegistryBuilderビルダー= new StandardServiceRegistryBuilder()。applySettings(configuration.getProperties());
SessionFactoryファクトリー= configuration.buildSessionFactory(builder.build());
クラスServiceRegistryBuilderは、4.3.0からStandardServiceRegistryBuilderに置き換えられました。 5.0リリースでは多くの変更があるようです。それでも、廃止予定のAPIとそれに適した代替手段についてはそれほど明確ではありません。すべてのインクリメンタルリリースには、廃止予定のAPIが追加されています。これらは、リリース5.0のコアフレームワークを微調整するためのものです。