Hibernate 升级到 5.2 - 会话工厂创建和替换 PersistentClass 以获取实体类属性
我目前正在将我的 Hibernate 版本升级到最新版本 5.2.10.我将 HibernateUtil 中的代码替换为 SessionFactory 创建.
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(上一页):
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);
}
}
}
现在我有一个方法,它可以通过将 DB 表名作为字符串传递来获取列名列表.我之前在 4.3.11.Final 中是这样操作的:
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;
}
现在升级后,它显示方法 getAllClassMetadata 已被弃用,并且在获取 PersistentClass 对象时面临困难.我看到了一个类似的问题 这里,但我无法完全弄清楚解决方案.我必须更改当前代码的哪一部分才能使我的 getColumnNames() 方法完全像以前一样工作.我参考了文档,它说要使用 EntityManagerFactory.getMetamodel()
代替,但我找不到合适的参考示例.我还需要为此更改 SessionFactory 创建机制吗?
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?
推荐答案
终于我做到了,感谢 Vlad 的文章.我采用了没有任何更改的集成器代码,并修改了我的 HibernateUtil
和 getColumns()
方法.所以这是我的代码:
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 创建:
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;
}
相关文章