Spring MVC + Hibernate - edycja modelu

0

Witam, nie wiem czy uda mi się to precyzyjnie opisać: otóż chce wyedytować obiekt "teacher" w formularzu pojawiaja sie aktualne dane, po kliknieciu posta chce żeby się zaaktualizowały, problem jest pewnie w tym że dostaje wyjątek, za pewne chodzi o to że przy update z Hibernate nie znajduje odpowiedniego obiektu w bazie. Jak temu zaradzić ? W springa dopiero wchodzę.

@Transactional
	@RequestMapping(value = "/editTeacher", method = RequestMethod.GET)
	public String editTeacher(Model model, HttpServletRequest request) {

		Teacher teacher = teacherDAO.getTeacher(Integer.parseInt(request
				.getParameter("id")));
		model.addAttribute("teacher", teacher);
		model.addAttribute("classes", classDAO.findAll());
		return "editTeacher";

	}

	@Transactional
	@RequestMapping(value = "/editTeacher", method = RequestMethod.POST)
	public String editTeacher(@Valid Teacher teacher, BindingResult errors,
			Model model, HttpServletRequest request) {


		if (errors.hasErrors()) {
			return "addTeacher";
		}

		
			
			teacherDAO.updateTeacher(teacher);
			
		return "editTeacher";
	}
<spring:url value="/editTeacher" var="editTeacher" htmlEscape="true"/>
	<sf:form method="POST" modelAttribute="teacher" action="${editTeacher}">
		<fieldse>
		<table cellspacing="0">
			<tr>
				<th><label for="username">Nazwa użytkownika</label></th>
				<td><sf:input path="username" id="username" /></td>
				<td><sf:errors path="username" cssClass="error" /></td>
			</tr>
			<tr>
				<th><label for="password">Hasło</label></th>
				<td><sf:input path="password" id="password" /></td>
				<td><sf:errors path="password" cssClass="error" /></td>
			</tr>
						<tr>
				<th><label for="name">Imię</label></th>
				<td><sf:input path="name" id="name" /></td>
				<td><sf:errors path="name" cssClass="error" /></td>
			</tr>
						<tr>
				<th><label for="surname">Nazwisko</label></th>
				<td><sf:input path="surname" id="surname" /></td>
				<td><sf:errors path="surname" cssClass="error" /></td>
			</tr>
			<tr>
				<th><label for="email">E-mail</label></th>
				<td><sf:input path="email" id="email" /></td>
				<td><sf:errors path="email" cssClass="error" /></td>
			</tr>
						<tr>
				<th><label for="schoolClass">Klasa</label></th>
				<td>
				<sf:select path="schoolClass" id="schoolClass">
					  <sf:option value="-1" label="--- Select ---" />
					  <c:forEach var="schoolClass" items="${classes}">
                    <option value="${schoolClass.id}">${schoolClass.fullName}</option>
                </c:forEach>
				       </sf:select>
                                </td>
                                <td><sf:errors path="schoolClass" cssClass="error" /></td>
			</tr>
			<tr>
				<th></th>
				<td><input name="commit" type="submit" value="Edytuj" /></td>
			</tr>
		</table>
		</fieldse>
	</sf:form>

0

i wyjątek:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

0

Robisz update...a nie widze żadnego pola hidden z id glownym

0

Nie rozumiem, mógłbyś sprecyzować ?

dodałem adnotacje @ModelAtributtte i w "post" już nie ma nulla przy "teacher", ale gdy tylko updatuje przez hibernate otrzymuje wyjątek podany pare postów wyżej.

Naprawdę nikt nie ma pomysłu jak to można rozwiązać ?

0

Ale przecież dostałeś już odpowiedź. Masz dodać ukryte pole z id do formularza, albo uzupełnić ID w obiekcie Teacher który przychodzi z formularza. Ukradli ci debuger? Jak się zapniesz w kontrolerze to zobaczysz że z formularza przychodzi ci obiekt BEZ USTAWIONEGO ID. Hibernate nie poradzi sobie z updatowaniem takiego obiektu.

0

Działa, ale nie rozumiem dlaczego musza byc wszystkie pola w formularzu, taki jest wymóg rozumiem ?

0

Nie. Nic nie rozumiesz. Równie dobrze mógłbyś w kontrolerze uzupełnić sobie to ID w obiekcie który przyszedł z formularza. Chodzi o to że obiekt z formularza będzie miał wypełnione te pola które były w formularzu i tyle. Jak w formularzu nie będzie jakiegoś pola to potem obiekt w kontrolerze nie będzie miał wartości w tym polu. U ciebie w formularzu nie było ID więc obiekt w kontrolerze tego ID mieć nie będzie.
A teraz żeby Hibernate mógł zrobić Update musi mieć ID w obiekcie bo inaczej nie ma jak znaleźć danego wiersza w bazie danych. Zauważ ze mógłbyś mieć kilka wierszy z takimi samymi wartościami, różnicącymi sie tlyko ID. Jak hibernate miałby wybrać który wiersz chcesz aktualizować?

1 użytkowników online, w tym zalogowanych: 0, gości: 1