Est-ce que buildSessionFactory () est déprécié dans hibernate 4?
quand j'ai mis à jour la version D'hibernation de 3.6.8.finale de la 4.0.0.final j'ai reçu un avertissement sur la méthode dépréciée buildSessionFactory()
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 la documentation j'ai trouvé variante dépréciée : (
Pouvez-vous m'aider avec ce petit malentendu ?
16 réponses
Oui il est déprécié. Remplacer votre SessionFactory par ce qui suit:
In Hibernation 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;
}
mise à jour:
Dans Hibernate 4.3 ServiceRegistryBuilder est obsolète . Utilisez plutôt ce qui suit.
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
Oui, il est déprécié. http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory () vous dit spécifiquement d'utiliser l'autre méthode que vous avez trouvé à la place ( buildSessionFactory(ServiceRegistry serviceRegistry)
) - donc utilisez-le.
la documentation est copiée de la version à la version, et n'a probablement pas encore été mise à jour (ils ne réécrivent pas le manuel avec chaque version) - donc faites confiance aux Javadocs.
le les détails de ce changement peuvent être consultés à l'adresse suivante:
- code Source: https://github.com/hibernate/hibernate-core/commit/0b10334e403cf2b11ee60725cc5619eaafecc00b
- billet: https://hibernate.onjira.com/browse/HHH-5991
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();
}
}
c'est aussi simple que cela: les docs JBoss ne sont pas 100% parfaitement bien entretenus. Allez avec ce que le JavaDoc dit : buildSessionFactory(ServiceRegistry serviceRegistry)
.
confirmé pour L'hibernation 4.3.0. Remarquez que vous pouvez supprimer le paramètre de nom de fichier XML, ou bien y fournir votre propre chemin. Ceci est similaire à (mais typos corrigé) d'autres postes 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);
il n'est pas inhabituel de trouver des divergences 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 retarder.
en règle générale, si le javadoc dit une chose et qu'une documentation non-javadoc la contredit, il y a de fortes chances que le javadoc soit plus précis. Les programmeurs sont plus susceptibles de garder la javadoc à jour avec les modifications du code ... parce que la" source " pour le javadoc est dans le même le dossier de code.
dans le cas des étiquettes @deprecated
, il est pratiquement certain que le javadoc est plus précis. Les développeurs déprécient les choses après mûre réflexion ... et (en général) ils ne les sous-estiment pas.
une meilleure façon de créer SessionFactory objet dans la dernière version d'hibernation 4.3.0 en avant est comme suit:
Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().
applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());
si vous utilisez hibernation 5.2 et plus alors 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);
}
}
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();
}
public void sampleConnection () sorts 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.");
}
j'ai édité la méthode créée par batbaatar au-dessus de de sorte qu'elle accepte l'objet de Configuration comme 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 I did:
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();
}
}
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();
}
}
voici de nombreux APIs dépréciés dans le cadre d'hibernation.
nous avons créé la session factory comme suit:
SessionFactory sessionFactory = new Configuration ().configurer.)(buildSessionFactory ();
la méthode buildSessionFactory est dépréciée de la version hibernate 4 et elle est remplacée par la nouvelle API. Si vous utilisez l'hibernation 4.3.0 et plus, votre code doit être:
-
Configuration configuration = nouvelle Configuration().configure ();
-
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings (configuration.getProperties ());
-
SessionFactory factory factory = configuration.buildSessionFactory(générateur de rapports.build ());
Classe ServiceRegistryBuilder est remplacé par StandardServiceRegistryBuilder à partir de 4.3.0. Il semble qu'il y aura beaucoup de changements dans la version 5.0. Il n'y a pas encore beaucoup de clarté sur les IPA dépréciés et les solutions de rechange appropriées à l'utilisation. Chaque version incrémentielle est dotée d'une API plus dépréciée, ils sont en train de peaufiner le cadre de base de la version 5.0.
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();
juste importer l'emballage suivant,
import org.hibernate.cfg.Configuration;