I am currently upgrading my Hibernate version to the latest version 5.2.10. I replaced my code in the HibernateUtil for the SessionFactory creation.
4.3.11.Final (Previous):
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 Final (New):
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); } } }
Now I have a method which would fetch me the list of column names by passing the DB table name as a string. I did it like this before in 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; }
Now after the upgrade it shows the method getAllClassMetadata as deprecated and am facing difficulty to get the PersistentClass object. I saw a similar question here but I couldn’t exactly figure out the solution. What part of my current code do I have to change for my getColumnNames() method to work exactly like before. I referred the documentation and it says to use the EntityManagerFactory.getMetamodel()
instead but i can’t find suitable reference examples of the same. Also will I have to change the SessionFactory creation mechanism for this?
Advertisement
Answer
Well finally I did it thank’s to Vlad’s article. I took the integrator code without any change and modified my HibernateUtil
and the getColumns()
method. So here’s my code:
SessionFactory creation:
public class HibernateUtil { private static final SessionFactory sessionFactory = buildSessionFactory(); public static SessionFactory getSessionFactory() { return buildSessionFactory(); } private static SessionFactory buildSessionFactory() { final BootstrapServiceRegistry bootstrapServiceRegistry = new BootstrapServiceRegistryBuilder().enableAutoClose() .applyIntegrator(MetadataExtractorIntegrator.INSTANCE).build(); final StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder(bootstrapServiceRegistry).configure().build(); return new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory(); } public static Session getSession() { Session hibernateSession = getSessionFactory().getCurrentSession(); return hibernateSession; } public static void shutdown() { getSessionFactory().close(); } }
Metadata Extractor(Get Column names):
public static List<String> getColumnNames(String tableName) { List<String> columnList = new ArrayList<>(); for (Namespace namespace : MetadataExtractorIntegrator.INSTANCE.getDatabase().getNamespaces()) { for (Table table : namespace.getTables()) { if (table.getName().equalsIgnoreCase(lookupTableName)) { Iterator<Column> iterator = table.getColumnIterator(); while (iterator.hasNext()) { columnList.add(iterator.next().getName()); } break; } } if (!columnList.isEmpty()) break; } return columnList; }