Столкнулся с проблемой, есть база данных с заказами пользователей. Есть метод, который согласно User id вытягивает заказы именно этого юзера. В юнитестах слой ДАО, Сервиса протестирован и все работает.
НО на стороне клиента при обновлении данные изменяются. Т.е, предположим юзер добавил 4 разных товара, потом 1 удалил. Обновляется страница и удаление не произошло, повторно обновляет бац и 3 товара, еще раз и опять 4.
На стороне сервера в базе все отображается корректно. Но на ЮИ проблема. При запуске Дебаггера все работает корректно. В чем проблема, понять не могу. Буду очень признателен за помощь, т.к. время подпирает конкретно....
Собственно код ЮИ:
<table>
<tr>
<th>№</th>
<th><ftm:message bundle="${i18n}" key="ord.id"/></th>
<th>Parts id</th>
<th>Quantity</th>
<th>Total sum</th>
<th><ftm:message bundle="${i18n}" key="ord.delete"/></th>
</tr>
<c:forEach var="ord" items="${orders}" varStatus="status">
<tr>
<td>${status.index + 1}</td>
<td>${ord.id}</td>
<td>${ord.parts_id}</td>
<td>${ord.quantity}</td>
<td>${ord.total}</td>
<td><form action="frontController?command=deleteord" method="post">
<button value="${ord.id}" name="deleteOrd" class="btn">Delete</button>
</form></td>
</tr>
</c:forEach>
</table>
Контроллер вывода:
public class OrderController implements Controller {
private OrdService ordService = OrdServiceIpl.getInstance();
@Override
public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user = (User)req.getSession().getAttribute("user");
List<Ord> orders = ordService.getByUserId(user.getId());
req.setAttribute("orders", orders);
RequestDispatcher dispatcher = req.getRequestDispatcher(MAIN_PAGE);
dispatcher.forward(req, resp);
}
}
Контроллер удаления:
public class DeleteOrdController implements Controller {
private OrdService ordService = OrdServiceIpl.getInstance();
@Override
public void execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
String id = req.getParameter("deleteOrd");
long ord_id = Long.parseLong(id);
ordService.delete(ord_id);
String contextPath = req.getContextPath();
resp.sendRedirect(contextPath + "/frontController?command=orders");
}
}
Сервисный слой:
@Override
public int delete(Serializable id) {
try {
return ordDao.delete(id);
} catch (SQLException e) {
throw new SecurityException("Ошибка удаления Ord по id " + id);
}
}
Сервисный:
@Override
public List<Ord> getByUserId(long userId) {
try {
return ordDao.getByUserId(userId);
} catch (SQLException e) {
rollback();
throw new SecurityException("Ошибка получения заказов по userId" + userId);
}
}
ДАО:
public List<Ord> getByUserId(long user_id) throws SQLException {
psGetByUserId = preparedStatement(getByUserId);
psGetByUserId.setLong(1, user_id);
psGetByUserId.execute();
ResultSet rs = psGetByUserId.getResultSet();
List<Ord> list = new ArrayList<>();
while (rs.next()) {
list.add(populateOrd(rs));
}
close(rs);
return list;
}
public int delete(Serializable id) throws SQLException {
psDelete = preparedStatement(deleteOrdQuery);
psDelete.setLong(1, (long) id);
return psDelete.executeUpdate();
}
Подозрений нет... ПОМОГИТЕ
Вопрос решен. В DAO слое создавалось несколько объекте соединения создавалось несколько preparedStatement. И из-за этого были такие пляски. Решение - статический блок:
{
try {
psSave = ConnectionManager.getConnection().prepareStatement(savePartsQuery, Statement.RETURN_GENERATED_KEYS);
psUpdate = ConnectionManager.getConnection().prepareStatement(updatePartsQuery);
psGet = ConnectionManager.getConnection().prepareStatement(getPartsQuery);
psGetAll = ConnectionManager.getConnection().prepareStatement(getAllPartQuery);
psDelete = ConnectionManager.getConnection().prepareStatement(deletePartsQuery);
psGetByCategory = ConnectionManager.getConnection().prepareStatement(getByCategory);
} catch (SQLException e) {
logger.error(e);
} finally {
}
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости