Как обрабатывать Hibernate SessionFactory в Spring Boot

Я учусь, и кто-нибудь знает, как получить доступ к фабрике сеансов Hibernate, созданной Spring Boot? я видел ряд решений, и я реализую приведенный ниже код, но я получаю исключение при попадании в службу

org.hibernate.HibernateException: No CurrentSessionContext configured!

приложение.свойства

spring.datasource.url= jdbc:mysql://localhost:3306/sakila
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext

конфигурация

@SpringBootApplication
public class SpringBootCurd1Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootCurd1Application.class, args);
    }

    @Bean
    public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf) {
        return hemf.getSessionFactory();
    }

}

дао

@Repository
public class EmployeeDao {

    @Autowired
    SessionFactory sessionFactory;

    /**
     * getListOfStates
     * 
     * @return
     */
    public List<?> getListOfStates(int userId) {

        String hql = "FROM states s WHERE " + "s.userid = :userId";
        Session session = sessionFactory.getCurrentSession();
        Query query = session.createQuery(hql);
        query.setParameter("userId", userId);
        session.flush();
        session.clear();
        return query.list();

    }

}

Почему? Просто используйте JPA, EntityManager вместо SessionFactory и Session... Если вам действительно не нужен Session, вы всегда можете сделать EntityManager.unwrap(Session.class), чтобы получить базовый сеанс. Но в настоящее время в вашем коде нет ничего, что оправдывало бы использование простого Hibernate.

M. Deinum 21.03.2019 11:12
0
1
3 538
1

Ответы 1

Не используйте простой спящий режим, а используйте JPA в качестве API, если только вам действительно не нужны специальные функции Hibernate (которые, глядя на ваш код, вам не нужны).

Поэтому перепишите свой код, чтобы использовать вместо него EntityManager:

Repository
public class EmployeeDao {

    @PersistenceContext
    private EntityManager entityManager;

    /**
     * getListOfStates
     * 
     * @return
     */
    public List<State> getListOfStates(int userId) {
        return em.createQuery("SELECT s FROM states s WHERE s.userid = :userId", State.class)
            .setParameter("userId", userId)
            .getResultList();

    }
}

Теперь, если вам действительно нужен доступ к Session, используйте EntityManager.unwrap(Session.class), чтобы получить его.

@Repository
public class EmployeeDao {

    @PersistenceContext
    private EntityManager entityManager;

    /**
     * getListOfStates
     * 
     * @return
     */
    public List<?> getListOfStates(int userId) {

        String hql = "FROM states s WHERE " + "s.userid = :userId";
        Session session = entityManager.unwrap(Session.class);
        Query query = session.createQuery(hql);
        query.setParameter("userId", userId);
        session.flush();
        session.clear();
        return query.list();

    }
}

Однако, как уже говорилось, вы действительно должны предпочесть JPA простому API Hibernate.

ПРИМЕЧАНИЕ: Теперь вы также можете удалить метод @Bean, который создает SessionFactory.

Правильное и чистое объяснение. шляпа снята

Md. Sajedul Karim 21.03.2019 13:07

могу ли я удалить spring.jpa.properties.hibernate.current_session_context_clas‌​s=org.springframewor‌​k.orm.hibernate4.Spr‌​ingSessionContext в application.properties?

AbhiRam 22.03.2019 07:07

Вы должны быть в состоянии сделать это при использовании этого подхода.

M. Deinum 22.03.2019 08:34

Другие вопросы по теме