Вы аннотировали свой класс Dao @Transactional, но не свой класс обслуживания. Строка:
Visitor storedVisitor =
(Visitor) sessionFactory.getCurrentSession().get(Visitor.class,
visitorDetails.getTfscNumber(), LockMode.NONE);
требует, чтобы вы были в транзакции.
Вы можете исправить это, добавив аннотацию @Transactional в свой класс ProfileService или просто метод registerVisitor ().
измените аннотацию вашего DAO с помощью @Repository
@Repository
public class ProfileDao {
.
.
.
}
, а затем сделайте свой метод обслуживания @Transactional, например, следующим образом
@Transactional
public List<Retailer> getRetailerByRetailerNumber(String retailerNo) {}
Я знаю, что это вопрос с некоторого возраста, но я столкнулся с этой проблемой и обнаружил, что если вы используете конфигурацию 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 не был подключен автоматически.
Надеюсь, что это помогает кому-то еще с похожими вопросами.