Как получить метаданные базы данных от менеджера сущностей

У меня есть приложение, которое использует Hibernate и JPA. Мне нужно выяснить, с какой БД это связано, чтобы какой-то нативный SQL-запрос я выполнял на основе, например, БД. оракул и постгрес. Если я использую чистый jdbc, то получить метаданные БД просто, но не знаю, как получить от менеджера сущностей.

Спасибо

Ответы на вопрос(4)

сущностей с этим кодом:

org.hibernate.engine.spi.SessionImplementor sessionImp = 
     (org.hibernate.engine.spi.SessionImplementor) eManager.getDelegate();
DatabaseMetaData metadata = sessionImp.connection().getMetaData();
//do whatever you need with the metadata object...
metadata.getDatabaseProductName();

Ура

Эммануэль

 SkorpEN06 июл. 2016 г., 15:04
В новых версиях Hibernate 3 это тоже работает.
 sakra26 авг. 2016 г., 10:38
Как получить менеджера по сущности eManager)?

EntityManagerFactory свойства, чтобы получить базовую конфигурацию базы данных, которая зависит от реализации.

Hibernate : hibernate.connection.driver_class

EclipseLink: eclipselink.target-database Это свойство указывает целевую базу данных. В вашем случае это может иметь значение какOracle илиPostgreSQL для соответствующей базы данных.

Генеральный javax.persistence.jdbc.driver

Из этой информации вы можете подключить базу данных.

EntityManagerFactory emf = entityManager.getEntityManagerFactory();     
Map<String, Object> emfProperties = emf.getProperties();

String driverClass = (String)emfProperties.get(PROPERTY);
//-- For PostgreSQL, it will have value "org.postgresql.Driver"

if(driverClass.lastIndexOf("postgresql") != -1)
    postGreSQL_DB = true;

Заметка Не очень понятно, как выглядит ваше приложение, но может случиться так, что ваше приложение подключено к обеим базам данных. Если возможно, вы можете попробовать иметь отдельныйEntityManager для каждой базы данных, указывая на различные постоянные единицы вpersistence.xml & может использовать его соответственно.

Если это не так, и только один из них подключен одновременно, то вы можете просто проверить это с помощьюentityManager.isOpen() илиemf.isOpen().

Редактировать

Connection connection = entityManager.unwrap(Connection.class);  
DatabaseMetaData metaData = connection.getMetaData();

Теперь вы можете получить название продукта базы данных, драйвер и т. Д.

 user50975516 мая 2012 г., 15:07
Спасибо Nayan за полезные советы. Когда я пытаюсь получить emf от em, я их не вижу, поэтому я придумал этот код DatabaseMetaData dbmd = ((Session) entityManager.getDelegate ()). Connection (). GetMetaData (); dbName = dbmd.getDatabaseProductName ();
 user50975516 мая 2012 г., 15:09
Я не знаю, что этот код переносим на diff-сервер, и правильный способ сделать это, так как hibernate собирается удалить метод connection () из версии 4.x. Но сейчас это будет работать для меня.
 Nayan Wadekar16 мая 2012 г., 15:44
@ user509755 Рад, что вы нашли это полезным. Я попробовал это с менеджером организации, поскольку вы упомянули это в вопросе. Кроме того, что случилось, когда вы пытались с менеджером сущностей. Вы можете опубликовать его как ответ, может кому-то помочь.
 user50975517 мая 2012 г., 23:42
Я не вижу метод под названием getEntityManagerFactory () в моем диспетчере сущностей. Вот почему я должен был найти альтернативный вариант, как я упоминал ранее.
 Nayan Wadekar18 мая 2012 г., 06:34
@ user509755 Это в Java EE 6, может ссылаться на Docs.oracle.com / JavaEE / 6 / API / javax / сохранение / ...

как это сделать с помощью Spring и Hibernate:

 @Repository
 public class UserRepository {

    @PersistenceContext
    private EntityManager em;

    public void getMeta() {
        org.hibernate.engine.spi.SessionImplementor sessionImp = (org.hibernate.engine.spi.SessionImplementor) em.getDelegate();
        DatabaseMetaData metadata = null;
        try {
            metadata = sessionImp.connection().getMetaData();
            ResultSet res = metadata.getColumns(null, null, "USERS", "USERNAME");
            System.out.println("List of columns: ");
            while (res.next()) {
                System.out.println(
                        "  " + res.getString("TABLE_SCHEM")
                                + ", " + res.getString("TABLE_NAME")
                                + ", " + res.getString("COLUMN_NAME")
                                + ", " + res.getString("TYPE_NAME")
                                + ", " + res.getInt("COLUMN_SIZE")
                                + ", " + res.getInt("NULLABLE"));
            }
            res.close();
            System.out.println();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

я) захочет получить информацию о jdbc, а вы используете hibernate 4.x, вы можете попробовать это следующим образом:

import java.sql.Connection;
import java.sql.SQLException;
import org.hibernate.jdbc.Work;
public class ConnectionInfo implements Work {

public String dataBaseUrl;
public String dataBaseProductName;
public String driverName;

@Override
public void execute(Connection connection) throws SQLException {
    dataBaseUrl = connection.getMetaData().getURL();
    dataBaseProductName = connection.getMetaData().getDatabaseProductName();
    driverName = connection.getMetaData().getDriverName();
}

public String getDataBaseProductName() {
    return dataBaseProductName;
}

public void setDataBaseProductName(String dataBaseProductName) {
    this.dataBaseProductName = dataBaseProductName;
}

public String getDataBaseUrl() {
    return dataBaseUrl;
}

public void setDataBaseUrl(String dataBaseUrl) {
    this.dataBaseUrl = dataBaseUrl;
}

public String getDriverName() {
    return driverName;
}

public void setDriverName(String driverName) {
    this.driverName = driverName;
}
}

Теперь вы можете получить свою информацию следующим образом:

// -- snip
org.hibernate.ejb.EntityManagerImpl entityManagerImpl =  (org.hibernate.ejb.EntityManagerImpl) genericDBAccess.getEntityManager().getDelegate();
    Session session = entityManagerImpl.getSession();
    connectionInfo = new ConnectionInfo();
    session.doWork(connectionInfo);
// -- snap

Надеюсь, это поможет! Я сводил с ума, находя эту информацию ....

Ваш ответ на вопрос