休止状態とjpaを使用しているアプリがあります。たとえば、データベースに基づいてネイティブSQLクエリを実行できるように、接続されているデータベースを見つける必要があります。オラクルとポストグル。純粋なjdbcを使用している場合、dbメタデータを取得するのは簡単ですが、エンティティマネージャーから取得する方法がわかりません
ありがとう
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();
乾杯
エマニュエル
回避策として、プロパティをフェッチして、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();
これで、データベースの製品名、ドライバーなどを取得できます。
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();
}
}
}
他の誰か (私のような) が 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
それが役立つことを願っています! 私はこの情報を見つけて夢中になりました....