2015-08-03 2 views
1

Попытка получить источник данных из сеанса Hibernate sessionFactory, чтобы я мог передать его на фабрику flyway.
Вот код, я использую:Спящий режим: получение источника данных из SessionFactory

SessionFactoryImpl factory = (SessionFactoryImpl) sessionFactory; 
ConnectionProvider provider = factory.getConnectionProvider(); 
if(provider instanceof DatasourceConnectionProviderImpl) { 
      System.out.println(">>>Dude, this is hack"); 
} 

код никогда не печатает заявление SYSOUT.

Я не Весна в моем проекте, нет никакого способа, я могу использовать SessionFactoryUtils.

+0

Использование фабричного застройщика сессии для создания сеанса facktory. –

+0

У меня есть sessionFactory, пытаясь получить от него источник данных. –

+0

Это невозможно, фабрика сеансов зависит от источника данных, создайте источник данных вручную. –

ответ

1

Вы можете получить DataSource от DataSourceFactory, что вы должны иметь на своем классе конфигурации. DataSourceFactory имеет build method, который возвращает ManagedDataSource, который реализует интерфейс DataSource.

Вы можете увидеть здесь пример (строка 38): https://github.com/dropwizard/dropwizard/blob/master/dropwizard-hibernate/src/main/java/io/dropwizard/hibernate/SessionFactoryFactory.java

EDITED

Вам нужен сервер джерси работает, чтобы получить среду. Если вы не имеете сервер работает в тот момент, когда Вы нуждаетесь в DataSource, вы можете создать экземпляр, делая что-то вроде этого:

DropwizardAppRule<Configuration> RULE = new DropwizardAppRule<Configuration>(Application.class, ResourceHelpers.resourceFilePath("test-config.yml"));

ManagedDataSource ds = RULE.getConfiguration().getDataSourceFactory() .build(RULE.getEnvironment().metrics(), "migrations");

+0

Как я могу завладеть «Среда» dropwizard, не отрываясь от Джерси-сервера? –

+0

Мне известно о 'DropwizardAppRule'. Попытка избежать этого, поскольку он запускает сам Джерси-сервер. –

+0

Я не нашел способ получить источник данных без фактического запуска сервера, поскольку '' 'ManagedDataSource''' требует серверной информации, т. Е. Метрики. – Carlos

0

Наконец-то я в конечном итоге делает это, который отлично работает для меня:

final ManagedDataSource dataSource = config.getDataSourceFactory().build(new MetricRegistry(), 
       "flyway-service"); 
     final Flyway flyway = new Flyway(); 
     flyway.setLocations(config.getFlywayFactory().getLocations().get(0)); 
     flyway.setDataSource(dataSource); 
     flyway.repair(); // 
     flyway.migrate(); 
     flyway.clean(); 

     if (flyway.migrate() <= 0) { 
      throw new RuntimeException("migration failed!"); 
     } 

Здесь config является Dropwizard, который я получил, анализируя конфигурационный файл YAML.

Смежные вопросы