#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. Правильно ли это?