Как вернуть результат транзакции в JPA - PullRequest
1 голос
/ 03 октября 2011

Просто фон, так как я привык использовать 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 генерирует этот код также с пустым возвратом.

@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 Ответ

2 голосов
/ 03 октября 2011

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

...