org.hibernate.HibernateException: не удалось получить синхронизированный с транзакцией сеанс для текущего потока - PullRequest
0 голосов
/ 09 июля 2019

Я работаю с SpringBoot и Hibernate ORM. Для модульного тестирования я использую junit. Я получаю вышеупомянутое исключение при выполнении только контрольного примера.

TestClass:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes={ MainApp.class })
public class TestEmplService {

    @Autowired EmployeeService eService;


    @BeforeClass
    public static void beforeTest() {
        System.out.println("Starting test engine");
    }

    @AfterClass
    public static void AfterTest() {
        System.out.println("Terminating test engine");
    }

    @Test
    public void  getEmployeeById() {
        Employee empObj = eService.findById(2);
        assertNotNull(empObj);
        System.out.println(empObj.toString());
    }
}

Класс реализации:

@Repository
public class EmployeeServiceImpl extends QueryHelper implements EmployeeService{

     @Autowired
     private SessionFactory sessionFactory;

    public EmployeeServiceImpl() {
        super("/queries/employee.yml");
        System.out.println(sessionFactory);
    }

    @Override

    public Employee findById(int id) {
        try {
        System.out.println("Find by id   "+sessionFactory); 
        Session session = sessionFactory.getCurrentSession();
        System.out.println("Find by id   "+session);    
        Employee employee = (Employee)session.get(Employee.class, id);
        //emailService.sendMessage("vrushak.k@sonata-software.com", "Searched Data", employee.toString());
        return employee;
        }
        catch(Throwable t) {
        throw new RepositoryException(t);   
        }
    }
}

Служба сотрудников - это просто интерфейс с описанным выше объявлением метода. Я получаю вышеупомянутое исключение, когда я запускаю только TestCase. Нормальное исполнение отлично работает.

MainApp.java

@SpringBootApplication()
@EnableAutoConfiguration
public class MainApp {

    public static void main(String... argsa) {
        // TODO Auto-generated method stub
    SpringApplication.run(MainApp.class, argsa);
    }

    @Bean()
    public EmployeeService employeeServices(){
        return new EmployeeServiceImpl();
    }

}

Основной класс приложения содержит employeeService впрыск, который загружается, как только начинается весна. Я предполагаю, что исключение вызвано где-то в фабрике сессий.

HibernateConfig.java

@Configuration
public class HibernateConfig {
    @Value("${db.driver}")
    private String DB_DRIVER;

    @Value("${db.password}")
    private String DB_PASSWORD;

    @Value("${db.url}")
    private String DB_URL;

    @Value("${db.username}")
    private String DB_USERNAME;

    @Value("${hibernate.dialect}")
    private String HIBERNATE_DIALECT;

    @Value("${hibernate.show_sql}")
    private String HIBERNATE_SHOW_SQL;

    @Value("${hibernate.hbm2ddl.auto}")
    private String HIBERNATE_HBM2DDL_AUTO;

    @Value("${entitymanager.packagesToScan}")
    private String ENTITYMANAGER_PACKAGES_TO_SCAN;



    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);
        Properties hibernateProperties = new Properties();
        hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT);
        hibernateProperties.put("hibernate.show_sql", HIBERNATE_SHOW_SQL);
        hibernateProperties.put("hibernate.hbm2ddl.auto", HIBERNATE_HBM2DDL_AUTO);
        sessionFactory.setHibernateProperties(hibernateProperties);
        return sessionFactory;
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(DB_DRIVER);
        dataSource.setUrl(DB_URL);
        dataSource.setUsername(DB_USERNAME);
        dataSource.setPassword(DB_PASSWORD);
        return dataSource;
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(sessionFactory().getObject());
        return txManager;
    }
}

Приведенный выше конфиг отвечает за загрузку фабрики сеанса и источника данных.

Пожалуйста, дайте мне знать, где я иду не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...