Как вернуть результат транзакции в JPA

#java #ejb-3.0 #jpa-2.0

#java #ejb-3.0 #jpa-2.0

Вопрос:

Просто фон, так как я привык использовать JDBC, так как я работал над старым проектом. При сохранении в базу данных я всегда устанавливаю значение -1 для любой неудачной вставки

 public class StudentDao{
    //This dao method returns -1 if unsuccessful in saving
    public int save(Student stud){
        Statement st = con.createStatement();
        try{
            int val = st.executeUpdate("INSERT student VALUES(.......)");
        }catch(Exception e){
            return -1;
        }
    }
}
  

Основываясь на возврате, я мог бы определить, прошла ли вставка успешно, чтобы я мог выполнить точную логику.
(Сообщите пользователю, что транзакция не завершена …)

Теперь я использовал EJB в сохраняющейся сущности. Большинство руководств, которые я вижу, имеют только эту конструкцию. Netbeans генерирует этот код также с возвратом ‘void’.

 @Stateless
public class StudentFacade{
    @PersistenceContext(unitName = "MyDBPU")
    private EntityManager em;

    public void save(Student student){
        em.persist(student);
    }
}
  

При сохранении объекта на сервлете он просто вызывает метод, подобный этому коду.

 @WebServlet(name = "StudentServlet",
loadOnStartup = 1,
urlPatterns = {
    "/addStudent",})
public class StudentServlet extends HttpServlet {
    @EJB
    private StudentFacade studentFacade;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //extract HTTP form request parameters then set 
        Student stud = Util.getStudent(request);

        studentFacade.save(stud);

    }
}
  

Но как я узнаю, прошла ли вставка успешно? (Не перехватывайте исключение, а затем просто позвольте ему распространяться.
Я настроил свою страницу ошибок, поэтому очевидно, что это приведет к ошибке ???)

Извините, я запутался в интеграции своих компонентов EJB, но я вижу его преимущества. Мне просто нужен совет по некоторым пунктам. Спасибо.

Ответ №1:

Контейнер передаст исключение вызывающей стороне (если вы ничего не делаете с ним внутри EJB). Я думаю, это было бы, вероятно, SQLException. Вы можете перехватить его на сервлете и делать с ним все, что захотите. Если вы используете транзакции, управляемые контейнером (CMT), транзакция будет автоматически отменена для вас контейнером, и объект student не будет добавлен. Как вы сказали, вы, конечно, можете оставить исключение и на веб-уровне, а затем подготовить для него специальную страницу ошибок. Все зависит от вашего сценария использования.

Комментарии:

1. Привет, Крис, это отличный комментарий. Скажем, я использовал этот сервлет в запросе Ajax, значит ли это, что в этом случае я должен обернуть его блоком Try / Catch? Мне нужно знать, произошло ли исключение, чтобы я мог создать правильный объект JSON. Правильно ли это?