24

...実際に読んだり解析したりせずにpersistence.xml

のファクトリEntityManagerのプロパティを使用して、の永続性ユニットの名前を取得できます。jboss-as-controller-clientを使用して利用可能なデータソースを取得できます。しかし、特定ののデータソースを提供するAPIは見つかりませんでした。EntityManager

String名前の付いたAで十分です。

ありがとうございました

JBoss7.1.1.FinalでJPA2を介してHibernate4.0.1.Finalを使用しています。

編集:可能であれば、JPAからHibernateAPIへの逸脱を避けたいと思います。

ClassCastException編集:Augustoのソリューションは機能しました、詳細についていくつかのメモがあります:EMのキャストは:( )のために機能しませんでしたorg.jboss.as.jpa.container.TransactionScopedEntityManager cannot be cast to org.hibernate.ejb.EntityManagerImplが、取得したファクトリでは機能しました。そのため、手順1を省略しました。

また、インスタンスからデータソースの名前を取得する方法も見つかりませんでした。だから私はカタログ名で満足しなければなりませんでした:connectionProvider.getConnection().getCatalog();

4

10 に答える 10

22

必要がある:

  1. toをキャストEntityManagerしますEntityManagerImpl(Hibernate実装)
  2. 電話getFactory()
  3. にキャストEntityManagerFactoryするHibernateEntityManagerFactory
  4. 呼び出しgetSessionFactory()てキャストしますSessionFactoryImpl
  5. 呼び出しgetConnectionProvider()て、正しい実装にキャストします。ここで実装を見ることができます。私はそれがDatasourceConnectionProvider
  6. 電話getDataSource()すれば完了です。

残念ながら、JPA APIを使用してデータソースを取得する方法がないため、HibernateAPIを使用する必要があります。

于 2012-09-14T12:05:02.520 に答える
16

Spring環境では、これを使用できます。

import org.springframework.orm.jpa.EntityManagerFactoryInfo;
...

@PersistenceContext
EntityManager entityManager;

public DataSource getDataSourceFromHibernateEntityManager() {
   EntityManagerFactoryInfo info = (EntityManagerFactoryInfo) entityManager.getEntityManagerFactory();
   return info.getDataSource();
}
于 2014-11-04T22:51:10.017 に答える
8

データソースの名前だけが必要で、そのデータソース名がJPA手段ごとに提供されている場合は、次の方法でその情報を取得できるはずです。

entityManager.getEntityManagerFactory().getProperties().get( "javax.persistence.jtaDataSource" );

また

entityManager.getEntityManagerFactory().getProperties().get( "javax.persistence.nonJtaDataSource" );

データソースの定義方法によって異なります。

于 2013-03-28T13:41:18.183 に答える
6

私はHibernate5.2.10.Finalを使用しており、次のように機能しました。

    import org.hibernate.SessionFactory;
    import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
    import javax.persistence.EntityManagerFactory;
    import javax.sql.DataSource;
    //...
    public static DataSource getDataSource(EntityManagerFactory entityManagerFactory) {
    ConnectionProvider cp = ((SessionFactory) entityManagerFactory).getSessionFactoryOptions()
            .getServiceRegistry()
            .getService(ConnectionProvider.class);
    return cp.unwrap(DataSource.class);
    }

必要なのは、entityManager.getEntityManagerFactory()をこのメソッドに渡すことだけです(私の場合、複数のファクトリがあります。次に、このメソッドを使用して、必要に応じてそれらのデータソースを取得できます)。

于 2018-11-14T18:14:56.520 に答える
4

Flywayの移行を実行するには、これを行う必要がありました。Augustoのメソッドを使用してデータソースを取得することはできませんでしたが、SessionFactoryプロパティからURL、ユーザー名、およびパスワードを取得することでデータソースを再作成できました。

SessionFactory sessionFactory = ((HibernateEntityManagerFactory) entityManagerFactory).getSessionFactory();
Properties properties = ((SessionFactoryImpl) sessionFactory).getProperties();
String url = (String) properties.get("hibernate.connection.url");
String username = (String) properties.get("hibernate.connection.username");
String password = (String) properties.get("hibernate.connection.password");
于 2013-10-17T16:30:58.383 に答える
3

これを試して :

Session s = (Session) getEntityManager().getDelegate();
org.hibernate.SessionFactory sessionFactory=s.getSessionFactory();
ConnectionProvider cp=((SessionFactoryImpl)sessionFactory).getConnectionProvider();Connection connection=cp.getConnection();
DatabaseMetaData dbmetadata= connection.getMetaData();
String dtsource=dbmetadata.getUserName();
于 2015-08-26T07:04:02.890 に答える
2

Hibernate5.0.xを使用しています

これは、永続性プールから接続を取得する方法です。

import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.jpa.internal.EntityManagerFactoryImpl;

public Connection getConnection(EntityManagerFactory emf) throws SQLException
{
    final EntityManagerFactoryImpl hibernateEmf = (EntityManagerFactoryImpl) emf;
    return hibernateEmf.getSessionFactory().getServiceRegistry().getService(ConnectionProvider.class).getConnection();
}

emfパラメータはJPAの標準であり、通常は以下javax.persistence.EntityManagerFactoryを使用してグローバルに取得されます。

emf = Persistence.createEntityManagerFactory("persistence-unit-name");

または注射による:

@PersistenceUnit(unitName="persistence-unit-name")
EntityManagerFactory emf;
于 2016-01-07T09:10:24.947 に答える
1
DataSource dataSource = (DataSource) 
em.getEntityManagerFactory().getProperties()
            .get(org.hibernate.cfg.AvailableSettings.JPA_JTA_DATASOURCE);

Hibernateを使用してdatasoureを取得できます。Hibernate5.3でテスト済み

于 2020-01-14T22:09:09.800 に答える
1

SpringBoot環境では、以下を使用できます。

@PersistenceContext
EntityManager entityManager;

private HikariDataSource getDataSourceFromHibernateEntityManager() {
    EntityManagerFactoryInfo info = (EntityManagerFactoryInfo) entityManager.getEntityManagerFactory();
    return (HikariDataSource) info.getDataSource();
}

public String getDataSourceProperties() {
    HikariDataSource dataSource = getDataSourceFromHibernateEntityManager();
    return "DataSource properties:" +
            "URL: " + dataSource.getJdbcUrl() + "\n" +
            "Default Schema: " + dataSource.getPoolName() + "\n" +
            "Driver Class Name: " + dataSource.getDriverClassName() + "\n" +
            "Username: " + dataSource.getUsername() + "\n";
}
于 2020-09-28T12:02:44.133 に答える
-1

これが私を助けたものです。私はHikariCPを使用していますが、それは問題ではないと思います。

基本的に何をする必要があるかは

  1. サービスレジストリを探す
  2. org.hibernate.engine.jdbc.connections.spi.ConnectionProviderクラスごとにサービスを受ける
  3. にアンラップしjavax.sql.DataSourceます。

サービスレジストリはEntityManagerから取得できます

((SessionImpl) em).getFactory().getServiceRegistry()

またはEntityManagerFactoryから直接

((SessionFactoryImpl) entityManagerFactory).getServiceRegistry()
于 2018-11-21T19:33:26.850 に答える