我当前正在将Hibernate版本升级到最新版本5.2.10。我将HibernateUtil中的代码替换为SessionFactory创建。
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决赛(新):
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); } } }
现在,我有了一个方法,该方法通过将数据库表名称作为字符串传递来获取列名称列表。我之前在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; }
现在,升级后,它显示方法getAllClassMetadata已弃用,并且很难获取PersistentClass对象。我在这里看到了类似的问题,但我无法确切地找到解决方案。我必须更改当前代码的哪一部分,才能使getColumnNames()方法完全像以前一样工作。我参考了文档,并说要使用, EntityManagerFactory.getMetamodel()但是我找不到合适的参考示例。还需要为此更改SessionFactory创建机制吗?
EntityManagerFactory.getMetamodel()
好吧,最后我感谢弗拉德的文章。我获取了集成器代码,未做任何更改,并修改了我HibernateUtil的getColumns()方法。所以这是我的代码:
HibernateUtil
getColumns()
SessionFactory的创建:
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(); } }
元数据提取器(获取列名称):
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; }