Aktualnie aktualizuję wersję Hibernuj do najnowszej wersji 5.2.10. Zastąpiłem mój kod w HibernateUtil dla stworzenia SessionFactory.Ulepszenie hibernacji do wersji 5.2 - Utworzenie fabryki sesji i zastąpienie obiektu PersistentClass w celu uzyskania właściwości klasy obiektu
4.3.11.Final (Poprzedni):
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 ostateczna (Nowe):
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);
}
}
}
Teraz mam metodę, która będzie pobierał mi listę nazw kolumn, przekazując nazwę tabeli DB jako ciąg znaków. Zrobiłem to tak, zanim w 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;
}
Teraz po aktualizacji pokazuje metoda getAllClassMetadata jako przestarzałe i jestem w obliczu trudności, aby uzyskać obiekt PersistentClass. Widziałem podobne pytanie here, ale nie mogłem dokładnie znaleźć rozwiązania. Której części mojego obecnego kodu muszę zmienić, aby moja metoda getColumnNames() działała dokładnie tak, jak poprzednio. Odesłałem dokumentację i powiedziałem, aby zamiast tego użyć EntityManagerFactory.getMetamodel()
, ale nie mogę znaleźć odpowiednich przykładów referencyjnych tego samego. Czy będę musiał zmienić mechanizm tworzenia sesji SessionFactory?
Dzięki @Vlad za odpowiedź.Czy będę musiał zastąpić mój kod klasy HibernateUtil, o którym wspomniałem powyżej, z sugerowanym przez ciebie mechanizmem ładowania początkowego Hibernate? Czy możesz wyjaśnić nieco więcej na ten temat, ponieważ ten mechanizm jest dla mnie stosunkowo nowy. Jak odczytuje konfigurację jako der nie ma hibernate.cfg.xml w twoim kodzie. Integrator Integrator = integrator() odnosi się do jakiej metody integratora? Również w metodzie testowej namespace.getTables() jest częścią org.hibernate.boot.relational.Namespace. Jak mogę uzyskać nazwę kolumny? –
Sprawdź [ten artykuł] (https://vladmihalcea.com/2017/05/02/how-to-get-access-to-database-table-metadata-with-hibernate-5/), aby zobaczyć, że możesz również uzyskać dostęp do kolumn. Możesz rozwidlić [moja książka, High-Performance Java Persistence, repozytorium GitHub] (https://github.com/vladmihalcea/high-performance-java-persistence/blob/master/core/src/test/java/com/vladmihalcea /book/hpjp/hibernate/metadata/MetadataTest.java), aby zobaczyć, jak to działa, a także bootstrap. –