Spring-Hibernate Сохранение отношений «один ко многим»

у нас есть три таблицы Люди (идентификатор, имя), Регистрации (идентификатор, p_id, sub_id, sem, дата), Субъекты (идентификатор, имя, инструктор)... Я хочу знать, какой слой является правильным для написания логики для сохранения списка Регистрация объектов в БД? Я имею в виду, что в настоящее время у меня есть следующий код в классе ResitrationController.

@RequestMapping(..)
public String addRegistrations(@RequestParam(value="personId", required=true) int personId, @RequestParam(value="subjectIdList", required=true) List<Integer> subjectIdList){

 List<Registrations> registrationList = new ArrayList<Registrations>();

 for(int subjectId : subjectIdList){

     Registration registration = new Registration();
     registration.setSem("fall-11");
     registration.setDate(new Date());
     registration.setPerson(personService.getPersonById(personId));
     registration.setSubject(subjectService.getSubjectById(subjectId));

     registrationList.add(registration);
}
registrationService.addRegistrations(registrationList);
}

Метод addRegistration службы RegistrationService просто вызывает тот же метод в RegistrationDao RegistraionService(){ @Autowired REgistraionDao regDao;

    @Transactional
    addRegistration(registrationList){
         regDao.addRegistration(registrationList);         
    }
  }

   RegistrationDao(){
    @Autowired SessionFactory sessionFactory;

    addRegistration(registrationList){
          for(Registration registration: registrationList){
              sessionFactory.getCurrentSession().save(registration);
          }
    }
    }

Я хочу знать, правильно ли использовать эту логику в методе контроллера или перенести ее в другое место? Я действительно хочу отправить список регистраций методу RegistrationService, потому что я хотел бы, чтобы вся транзакция откатилась, даже если один из объектов не сохраняется.. спасибо


person RKodakandla    schedule 19.09.2011    source источник


Ответы (1)


Код выше работает? Он работает, но не является транзакционным?

В любом случае, я считаю, что вам следует добавить управляемые объекты в файл registrationList. Таким образом, их необходимо сохранить и прошить перед вызовом метода add(). Это должно быть сделано внутри транзакции. Так что, на мой взгляд, вам лучше сделать это внутри некоторого класса «менеджер». это будет дополнительный слой между контроллером и вашими DAO или, возможно, вашими классами обслуживания (это зависит от того, для чего вы используете свой уровень обслуживания).

person unixorn    schedule 26.09.2011
comment
спасибо за ответ Unixorn, это то, что я сделал после просмотра нескольких примеров в Интернете.. Создал менеджер регистрации и автоматически подключил все необходимые классы обслуживания.. - person RKodakandla; 27.09.2011