Я учусь, и кто-нибудь знает, как получить доступ к фабрике сеансов 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 в качестве 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.
Правильное и чистое объяснение. шляпа снята
могу ли я удалить spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext в application.properties?
Вы должны быть в состоянии сделать это при использовании этого подхода.
Почему? Просто используйте JPA,
EntityManagerвместоSessionFactoryиSession... Если вам действительно не нуженSession, вы всегда можете сделатьEntityManager.unwrap(Session.class), чтобы получить базовый сеанс. Но в настоящее время в вашем коде нет ничего, что оправдывало бы использование простого Hibernate.