19

休止状態とjpaを使用しているアプリがあります。たとえば、データベースに基づいてネイティブSQLクエリを実行できるように、接続されているデータベースを見つける必要があります。オラクルとポストグル。純粋なjdbcを使用している場合、dbメタデータを取得するのは簡単ですが、エンティティマネージャーから取得する方法がわかりません

ありがとう

4

7 に答える 7

9

Hibernate 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();

乾杯

エマニュエル

于 2013-10-03T02:01:04.263 に答える
9

回避策として、プロパティをフェッチして、EntityManagerFactory実装固有の基礎となるデータベース構成を取得できます。

  • 休止状態: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ことができ、それに応じて使用できます。

これが当てはまらず、一度に 1 つしか接続されていない場合は、entityManager.isOpen()またはで簡単に確認できますemf.isOpen()

編集 :

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

これで、データベースの製品名、ドライバーなどを取得できます。

于 2012-05-15T20:56:38.467 に答える
4

Emmanuel answer に基づいて、Spring と休止状態でそれを行う方法:

 @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();
        }
    }
}
于 2016-03-04T00:07:22.683 に答える
0

他の誰か (私のような) が 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

それが役立つことを願っています! 私はこの情報を見つけて夢中になりました....

于 2012-05-29T09:46:45.637 に答える