#java #hibernate #jsp #jstl
#java #спящий режим #jsp #jstl
Вопрос:
- У меня настроено сопоставление OneToMany для моего ученика, поэтому у ученика может быть несколько адресов. Элементы отображаются правильно, но когда я сохраняю данные через форму, для адреса генерируется идентификатор (пользователь уже создан, мне просто нужно нажать добавить адрес, также я получаю правильного пользователя), но при сохранении значения равны нулю, вот мои фрагменты java и jsp
@PostMapping("/addAddress")
public String showFormForAddAddress(@RequestParam("studentId") int id, Model model) {
Student student = studentService.findStudentById(id);
Address address = new Address();
model.addAttribute("address", address);
List<Address> addresses = student.getAddresses();
addresses.add(address);
student.setAddresses(addresses);
studentService.saveStudent(student);
return "address-form";
}
@GetMapping("/addAddress")
public String addAddress(@RequestParam("studentId") int id, Model model) {
Address address = new Address();
address.setStudentId(id);
model.addAttribute("address", address);
return "address-form";
}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Address Form</title>
</head>
<body>
<div id="wrapper">
<div id="header">
<h2>SRM Student Relationship Manager (Address)</h2>
</div>
</div>
<div id="container">
<h3>Save Address</h3>
<form:form action="addAddress" modelAttribute="address" method="POST">
<form:input path="studentId" />
<table>
<tbody>
<tr>
<td><label>Address One</label></td>
<td><form:input path="addressOne" /></td>
</tr>
<tr>
<td><label>City</label></td>
<td><form:input path="city" /></td>
</tr>
<tr>
<td><label>State</label></td>
<td><form:input path="state" /></td>
</tr>
<tr>
<td><label>Zip Code</label></td>
<td><form:input path="zipCode" /></td>
</tr>
<tr>
<td><label>Address Two</label></td>
<td><form:input path="addressTwo" /></td>
</tr>
<tr>
<td><label></label></td>
<td><input type="submit" value="Save"></td>
</tr>
</tbody>
</table>
</form:form>
</div>
</body>
</html>
- Также для перестраховки это мои объекты
@Entity
@Table(name = "address", catalog = "user_db")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "address_id")
private Integer id;
private String addressOne;
private String city;
private String state;
private String zipCode;
private String addressTwo;
@Column(name = "user_id")
private Integer studentId;
@Entity
@Table(name = "Student", catalog = "user_db")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "student_id")
private int id;
private String firstName;
private String lastName;
private String email;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "student_id", referencedColumnName = "student_id")
private List<Address> addresses;
Я чувствую, что это может быть проблемой с именами, но я не могу на это указать, также я попытался удалить сообщение и просто использовать get, но все равно не сработало.
Ответ №1:
это должно быть showForForAddMethod
@PostMapping("/addAddress")
public String showFormForAddAddress(@RequestParam("studentId") int id, Model model,
@ModelAttribute("address") Address address) {
Student student = studentService.findStudentById(id);
model.addAttribute("address", address);
List<Address> addresses = student.getAddresses();
addresses.add(address);
student.setAddresses(addresses);
studentService.saveStudent(student);
return "redirect:/student/list";
}
Если я создаю новый объект, информация не отображается и, следовательно, она теряется, но когда я передаю адрес в качестве атрибута модели в параметрах, это указывает на объект student
Ответ №2:
В вашем showFormForAddAddress
методе вы написали model.addAttribute("address", address);
, что это помещает значения в атрибут модели.
Но вы пытались получить адресную информацию из этого метода, это неправильно.
Вы можете получить соответствующую информацию, используя приведенный ниже подход:
Map<String,Object> modelMap = model.getModel().asMap();
Object object = modelMap.get("address");
После этого вы можете преобразовать полученный объект в тип адреса и использовать его