Je suis en train de mettre à jour ma version d'Hibernate vers la dernière version 5.2.10. J'ai remplacé mon code dans HibernateUtil pour la création de SessionFactory.Mise à niveau d'Hibernate vers la version 5.2 - Création de Session Factory et remplacement de PersistentClass pour obtenir les propriétés de classe d'entité
4.3.11.Final (Précédent):
public class HibernateUtil {
private HibernateUtil() {}
private static SessionFactory sessionFactory;
private static Configuration configuration;
public static Configuration getConfiguration() {
return configuration;
}
private static SessionFactory buildSessionFactory() {
try {
if(sessionFactory == null) {
configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
sessionFactory = configuration
.buildSessionFactory(serviceRegistry);
}
return sessionFactory;
}
catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return buildSessionFactory();
}
public static Session getSession() {
Session hibernateSession = getSessionFactory().getCurrentSession();
return hibernateSession;
}
public static void shutdown() {
getSessionFactory().close();
}
}
5.2.10 finale (Nouveau):
public class HibernateUtil {
private static StandardServiceRegistry registry;
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
return buildSessionFactory();
}
public static SessionFactory buildSessionFactory() {
if (sessionFactory == null) {
try {
registry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
MetadataSources sources = new MetadataSources(registry);
Metadata metadata = sources.getMetadataBuilder().build();
sessionFactory = metadata.getSessionFactoryBuilder().build();
} catch (Exception e) {
e.printStackTrace();
shutdown();
}
}
return sessionFactory;
}
public static Session getSession() {
Session hibernateSession = getSessionFactory().getCurrentSession();
return hibernateSession;
}
public static void shutdown() {
if (registry != null) {
StandardServiceRegistryBuilder.destroy(registry);
}
}
}
Maintenant, j'ai une méthode qui me chercher la liste des noms de colonnes en transmettant le nom de la table DB en tant que chaîne. Je l'ai fait comme ça avant dans 4.3.11.Final:
public static List<String> getColumnNames(String tableName) {
List<String> columnList=null;
Map<String, ClassMetadata> map = HibernateUtil.getSessionFactory().getAllClassMetadata();
Iterator<Entry<String, ClassMetadata>> itr = map.entrySet().iterator();
while(itr.hasNext()){
ClassMetadata classMetaData = itr.next().getValue();
AbstractEntityPersister aep = (AbstractEntityPersister) classMetaData;
if(aep.getTableName().split("\\.")[1].equalsIgnoreCase(tableName)){
columnList = new ArrayList<String>();
String[] propertyNames = classMetaData.getPropertyNames();
for(String property : propertyNames){
try {
PersistentClass persistentClass = HibernateUtil .getConfiguration().getClassMapping(classMetaData.getEntityName());
String clmName = ((Column) persistentClass.getProperty(property).getColumnIterator().next()).getName();
columnList.add(clmName);
} catch(NoSuchElementException e){
log.error("Element not found idenfied as : "+property);
} catch(Exception e){
log.error(e.getMessage());
}
}
break;
}
}
return columnList;
}
Maintenant, après la mise à niveau, il montre la méthode getAllClassMetadata comme dépréciée et je suis face à la difficulté d'obtenir l'objet PersistentClass. J'ai vu une question similaire here mais je ne pouvais pas comprendre exactement la solution. Quelle partie de mon code actuel dois-je changer pour que ma méthode getColumnNames() fonctionne exactement comme avant? J'ai référé la documentation et il dit d'utiliser le EntityManagerFactory.getMetamodel()
à la place, mais je ne peux pas trouver des exemples de référence appropriés de la même chose. Aussi dois-je changer le mécanisme de création de SessionFactory pour cela?
Merci @Vlad pour votre réponse.Alors devrais-je remplacer mon code de classe HibernateUtil que j'ai mentionné ci-dessus avec le mécanisme de bootstrap Hibernate que vous avez suggéré? Aussi pouvez-vous expliquer un peu plus à ce sujet car ce mécanisme est relativement nouveau pour moi. Comment lit-il la configuration en tant que pas de hibernate.cfg.xml dans votre code? La ligne integrator integrator = integrator() fait référence à quelle méthode d'intégrateur? Toujours dans la méthode de test, namespace.getTables(), fait partie de org.hibernate.boot.relational.Namespace. Aussi comment puis-je obtenir le nom de la colonne? –
Découvrez [cet article] (https://vladmihalcea.com/2017/05/02/how-to-get-access-to-database-table-metadata-with-hibernate-5/) pour voir que vous pouvez avoir accès aux colonnes aussi. Vous pouvez bifurquer [mon livre, Java Persistence à haute performance, référentiel GitHub] (https://github.com/vladmihalcea/high-performance-java-persistence/blob/master/core/src/test/java/com/vladmihalcea /book/hpjp/hibernate/metadata/MetadataTest.java) pour voir comment cela fonctionne, ainsi que le bootstrap. –