Spring и hibernate: для текущего потока сеанс не найден

21
задан Gray 1 July 2016 в 18:54
поделиться

3 ответа

Вы аннотировали свой класс Dao @Transactional, но не свой класс обслуживания. Строка:

Visitor storedVisitor =
    (Visitor) sessionFactory.getCurrentSession().get(Visitor.class,
            visitorDetails.getTfscNumber(), LockMode.NONE);

требует, чтобы вы были в транзакции.

Вы можете исправить это, добавив аннотацию @Transactional в свой класс ProfileService или просто метод registerVisitor ().

44
ответ дан Gray 1 July 2016 в 18:54
поделиться

измените аннотацию вашего DAO с помощью @Repository

@Repository
public class ProfileDao { 
.
.
.
}

, а затем сделайте свой метод обслуживания @Transactional, например, следующим образом

@Transactional
public List<Retailer> getRetailerByRetailerNumber(String retailerNo) {}
6
ответ дан erimerturk 1 July 2016 в 18:54
поделиться

Я знаю, что это вопрос с некоторого возраста, но я столкнулся с этой проблемой и обнаружил, что если вы используете конфигурацию Spring-Java, то разрешение имеет несколько частей для этого. Относительное размещение некоторой конфигурации к контроллеру было важно.

Во-первых, CoreConfiguration

@Configuration
public class CoreConfiguration {
@Bean          
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean factoryBean = new org.springframework.orm.hibernate4.LocalSessionFactoryBean();
    String annotatedPckgs[] ={"org.tigersndragons.reports.model.warehouse"};
    factoryBean.setAnnotatedPackages(annotatedPckgs);           
    Properties hibernateProperties = new Properties();
    try {
        hibernateProperties.load(this.getClass().getResourceAsStream("props/hibernate.properties"));        
        factoryBean.setHibernateProperties(hibernateProperties);
    } catch (IOException e) { }
    factoryBean.setPackagesToScan("org.telligen.reports.model.warehouse");
    factoryBean.setDataSource(warehouseDataSource());//("jdbc/warehouse");
    try {
        factoryBean.afterPropertiesSet();
    } catch (IOException e) {       }
    return factoryBean;
}
@Bean
public WarehouseDAO getWarehouseDAO(){
    WarehouseDAO wrhsDao = new WarehouseDAO();
    wrhsDao.setSessionFactory(sessionFactory().getObject());
    return wrhsDao;
}

...

@Configuration
public class ScheduleConfiguration {
private static Logger logger = LoggerFactory.getLogger(ScheduleConfiguration.class);

@Autowired
private CoreConfiguration coreConfiguration;


@Bean
public HandlerMapping handlerMapping(){
    DefaultAnnotationHandlerMapping mapping =  new DefaultAnnotationHandlerMapping();
    mapping.setInterceptors(new Object []{coreConfiguration.openSessionViewInterceptor()});
    return mapping;
}

@Bean
public HandlerAdapter handerAdapter(){
    return new AnnotationMethodHandlerAdapter();
}

@Bean
public ScheduleController scheduleController() throws Exception{
    ScheduleController controller = new ScheduleController();
        controller.setWrhsDao(coreConfiguration.getWarehouseDAO());
    return controller;
}

 ...

В контроллере мне нужно было установить

@Controller
@RequestMapping
public class ScheduleController {
private static Logger logger = LoggerFactory.getLogger(ScheduleController.class);

private WarehouseDAO wrhsDao;
    @RenderMapping
@RequestMapping("VIEW")
public String viewSchedule(Map<String, Object> modelMap){...}

public void setWrhsDao(WarehouseDAO wrhsDao) {
    this.wrhsDao = wrhsDao;
}
}

WarehouseDAO имеет аннотацию @Repository, а SessionFactory не был подключен автоматически.

Надеюсь, что это помогает кому-то еще с похожими вопросами.

1
ответ дан iowatiger08 1 July 2016 в 18:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: