मैं वर्तमान में अपने हाइबरनेट संस्करण को नवीनतम संस्करण 5.2.10 में अपग्रेड कर रहा हूं। मैंने सत्र कोड फैक्टरी के लिए HibernateUtil में अपना कोड बदल दिया।हाइबरनेट 5.2 तक अपग्रेड करें - सत्र फैक्टरी निर्माण और इकाई वर्ग गुण प्राप्त करने के लिए PersistentClass को प्रतिस्थापित करना
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);
}
}
}
अब मैं एक तरीका है जिसके मुझे सूची प्राप्त होता है एक स्ट्रिंग के रूप में डीबी टेबल नाम पास करके कॉलम नामों का। मैं 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 वस्तु प्राप्त करने के लिए कठिनाई का सामना करना पड़ रहा दर्शाता है। मैंने एक समान प्रश्न here देखा लेकिन मैं समाधान को बिल्कुल समझ नहीं पाया। मेरे वर्तमान कोड का कौन सा हिस्सा मुझे अपने getColumnNames() विधि के लिए पहले जैसा काम करने के लिए बदलना है। मैंने प्रलेखन का संदर्भ दिया और यह इसके बजाय EntityManagerFactory.getMetamodel()
का उपयोग करने के लिए कहता है लेकिन मुझे इसके उपयुक्त संदर्भ उदाहरण नहीं मिल रहे हैं। इसके लिए मुझे सत्र फैक्ट्री निर्माण तंत्र भी बदलना होगा?
धन्यवाद @Vlad:
मेटाडाटा इक्स्त्रैक्टर (कॉलम नाम प्राप्त करें)।तो क्या मुझे अपने हाइबरनेट को क्लास कोड को प्रतिस्थापित करना होगा जिसे मैंने उपरोक्त वर्णित हाइबरनेट बूटस्ट्रैप तंत्र के साथ बताया है? इसके अलावा आप इसके बारे में कुछ और बता सकते हैं क्योंकि यह तंत्र मेरे लिए अपेक्षाकृत नया है। यह कॉन्फ़िगरेशन को आपके कोड में der's no hibernate.cfg.xml के रूप में कैसे पढ़ता है। लाइन इंटीग्रेटर इंटीग्रेटर = इंटीग्रेटर() किस इंटीग्रेटर विधि को संदर्भित करता है? परीक्षण विधि में, namepace.getTables(), यह org.hibernate.boot.relational.Namespace का हिस्सा है। मैं कॉलम नाम कैसे प्राप्त कर सकता हूं? –
यह देखने के लिए [इस आलेख] (https://vladmihalcea.com/2017/05/02/how-to-get-access-to-डेटा-table-metadata-with-hibernate-5/) देखें कि आप देख सकते हैं कॉलम तक पहुंच प्राप्त करें। आप कांटा [मेरी पुस्तक, उच्च प्रदर्शन जावा दृढ़ता, गिटहब भंडार] कर सकते हैं (https://github.com/vladmihalcea/high-performance-java-persistence/blob/master/core/src/test/java/com/vladmihalcea /book/hpjp/hibernate/metadata/MetadataTest.java) यह देखने के लिए कि यह कैसे काम करता है, साथ ही साथ बूटस्ट्रैप भी। –