Lorsque j'ai mis à jour la version d'Hibernate de 3.6.8.final à 4.0.0.final, un avertissement concernant la méthode obsolète buildSessionFactory()
s'affiche dans cette ligne:
private static final SessionFactory sessionFactory =
new Configuration().configure().buildSessionFactory();
le javadoc recommande l'utilisation d'une autre méthode
buildSessionFactory(ServiceRegistry serviceRegistry)
mais dans le documentation j'ai trouvé la variante déconseillée :(
Pouvez-vous m'aider avec ce petit malentendu?
Oui, c'est obsolète. Remplacez votre SessionFactory par ce qui suit:
Dans 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;
}
PDATE:
Dans Hibernate 4., ServiceRegistryBuilder est obsolète. Utilisez ce qui suit à la place.
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
Oui, c'est déconseillé. http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory () vous indique spécifiquement d'utiliser l'autre méthode que vous avez trouvée à la place ( buildSessionFactory(ServiceRegistry serviceRegistry)
) - utilisez-le donc.
La documentation est copiée d'une édition à l'autre et n'a probablement pas encore été mise à jour (le manuel ne sera pas réécrit à chaque édition) - alors faites confiance aux Javadocs.
Les détails de ce changement peuvent être consultés à:
Quelques références supplémentaires:
ou
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();
}
}
Code vérifié pour fonctionner dans Hibernate 4.3.0. Notez que vous pouvez supprimer le paramètre de nom de fichier XML ou indiquer votre propre chemin. Ceci est similaire à (mais des fautes de frappe corrigées) d’autres articles ici, mais celui-ci est correct.
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);
C'est aussi simple que cela: les documents JBoss ne sont pas parfaitement entretenus à 100%. Allez avec ce que dit le JavaDoc : buildSessionFactory(ServiceRegistry serviceRegistry)
.
Il n’est pas rare de trouver des différences entre les différentes versions de la documentation. La plupart des développeurs considèrent la documentation comme une corvée et ils ont tendance à la remettre à plus tard.
En règle générale, si le javadoc dit une chose et que la documentation non-javadoc la contredit, il y a de fortes chances que le javadoc soit plus précis. Les programmeurs sont plus susceptibles de maintenir le javadoc à jour avec les modifications apportées au code ... car la "source" du javadoc se trouve dans le même fichier que le code.
Dans le cas des balises @deprecated
, il est pratiquement certain que le javadoc est plus précis. Les développeurs déprécient certaines choses après un examen approfondi ... et (en général), ils ne les surdonnent pas.
Si vous utilisez Hibernate 5.2 et supérieur, vous pouvez utiliser ceci:
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);
}
}
Une meilleure façon de créer SessionFactory object dans la dernière version d'hibernate 4.3. est la suivante:
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();
}
}
Dans hibernate 5.3.1
, vous pouvez essayer ceci:
ServiceRegistry standardRegistry =
new StandardServiceRegistryBuilder().configure().build();
Metadata sources = new MetadataSources(standardRegistry).addAnnotatedClass(MyEntity.class).getMetadataBuilder().build();
SessionFactory sf = sources.buildSessionFactory();
J'ai édité la méthode créée par batbaatar ci-dessus afin qu'il accepte l'objet de configuration en tant que paramètre:
public static SessionFactory createSessionFactory(Configuration configuration) {
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
factory = configuration.buildSessionFactory(serviceRegistry);
return factory;
}
Dans la classe principale j'ai fait:
private static SessionFactory factory;
private static Configuration configuration
...
configuration = new Configuration();
configuration.configure().addAnnotatedClass(Employee.class);
// Other configurations, then
factory = createSessionFactory(configuration);
Dans 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 () lève Exception {
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.");
}
il existe de nombreuses API déconseillées dans le cadre principal hibernate.
nous avons créé la fabrique de sessions comme ci-dessous:
SessionFactory sessionFactory = new Configuration (). Configure (). BuildSessionFactory ();
La méthode buildSessionFactory est obsolète depuis la version 4 de hibernate et elle est remplacée par la nouvelle API. Si vous utilisez la version 4.3.0 ou ultérieure d'Hibernate, votre code doit être:
Configuration configuration = new Configuration (). Configure ();
Générateur StandardServiceRegistryBuilder = new StandardServiceRegistryBuilder (). ApplySettings (configuration.getProperties ());
SessionFactory Factory = configuration.buildSessionFactory (builder.build ());
La classe ServiceRegistryBuilder est remplacée par StandardServiceRegistryBuilder à partir de 4.3.0. Il semble y avoir beaucoup de changements dans la version 5.0. Il n’existe toujours pas beaucoup de clarté sur les API obsolètes et sur les alternatives appropriées à utiliser. Chaque version incrémentielle est associée à une API plus obsolète. Elle est en train de peaufiner le cadre principal de la version 5.0.