Весенняя загрузка вставляет EntityManagerFactory в конфигурационный класс - PullRequest
0 голосов
/ 01 июня 2018

Я использую весеннюю загрузку, и я хочу интегрировать пружину в спящий режим.Я хочу сделать Session Factory bean для дальнейшего использования.Но я не могу автоматически подключить EntityManagerFactory, я не могу автоматически подключить его только в классе конфигурации, в других классах это работает.Можете ли вы помочь, пожалуйста?

Класс конфигурации

package kz.training.springrest.configuration;

@Configuration
@EnableTransactionManagement
public class DatabaseConfiguration {

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Bean
    public SessionFactory getSessionFactory() {
        if (entityManagerFactory.unwrap(SessionFactory.class) == null) {
            throw new NullPointerException("factory is not a hibernate factory");
        }
        return entityManagerFactory.unwrap(SessionFactory.class);
    }
}

зависимости

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.2</version>
        </dependency
    </dependencies>

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Я не совсем уверен, почему вы хотите выставить оба bean-компонента, потому что, как указывает @chrylis, вы можете легко развернуть EMF в SF при необходимости.

// Some spring component
@Component
public class MyFancyComponent {
  @PersistenceContext
  private EntityManager entityManager;

  public void doSomethingFancy() {
    // public SessionFactory API
    final SessionFactory sf = entityManager
         .unwrap( Session.class ).getFactory();

    // public SessionFactoryImplementor SPI
    final SessionFactoryImplementor sfi = entityManager
         .unwrap( SessionImplementor.class ).getFactory();
  }
}
0 голосов
/ 01 июня 2018

Когда вы говорите

Но я не могу автоматически связать EntityManagerFactory

Не удается скомпилировать или выдать исключение во время выполнения?Если последнее, что говорит трассировка стека?

Одним из возможных решений / обходного пути может быть внедрение em в конфигурацию вместо фабрики em с использованием аннотации @PersistenceContext:

@Configuration
@EnableTransactionManagement
public class DatabaseConfiguration {

    @PersistenceContext
    private EntityManager entityManager;

    @Bean
    public SessionFactory getSessionFactory() {
        // no need to check for null here because if the unwrap fails, it will do
        // so by throwing a PersistenceException rather than returning null.
        return entityManager.unwrap( Session.class ).getFactory();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...