我是 Spring MVC 和 Hibernate(以及一般数据库)的新手,所以需要一些帮助。
目前我的数据库中有 2 个表 - Booking 和 Restaurant。 Booking 有一个外键 R_id
指向 Restaurant 的主键。现在我正在尝试实现一个下拉菜单,它显示数据库中的所有餐厅,当用户选择餐厅时,该值将在该预订数据库中设置。我希望你明白我的意思。
我的预订舱位:
@Entity
@Table(name="booking")
public class Booking {
@Id
@Column(name="id")
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name="R_id")
private Restaurant restaurant;
@Column(name="date")
@Type(type="date")
private Date date;
@Column(name="start")
@Type(type="time")
private Date start;
@Column(name="duration")
private float duration;
@Column(name="amount_of_people")
private int amountOfPeople;
@Column(name="name")
private String name;
@Column(name="contact_preference")
private String contactPreference;
@Column(name="comments")
private String comments;
@Column(name="current_datetime")
@Type(type="timestamp")
private Date currentDatetime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Restaurant getRestaurant() {
return restaurant;
}
public void setRestaurant(Restaurant restaurant) {
this.restaurant = restaurant;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Date getStart() {
return start;
}
public void setStart(Date start) {
this.start = start;
}
public float getDuration() {
return duration;
}
public void setDuration(float duration) {
this.duration = duration;
}
public int getAmountOfPeople() {
return amountOfPeople;
}
public void setAmountOfPeople(int amountOfPeople) {
this.amountOfPeople = amountOfPeople;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContactPreference() {
return contactPreference;
}
public void setContactPreference(String contactPreference) {
this.contactPreference = contactPreference;
}
public String getComments() {
return comments;
}
public void setComments(String comments) {
this.comments = comments;
}
public Date getCurrentDatetime() {
return currentDatetime;
}
public void setCurrentDatetime(Date currentDatetime) {
this.currentDatetime = currentDatetime;
}
}
餐厅等级:
@Entity
@Table(name="restaurant")
public class Restaurant {
@Id
@Column(name="id")
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
@Column(name="restaurant_name")
private String restaurantName;
@Column(name="address")
private String address;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getRestaurantName() {
return restaurantName;
}
public void setRestaurantName(String restaurantName) {
this.restaurantName = restaurantName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String toString() {
return restaurantName;
}
}
MainController中相关方法:
@RequestMapping(value = "booking/create", method = RequestMethod.GET)
public String createBooking(Model model) {
model.addAttribute("booking", new Booking());
initModelList(model);
return "newBooking";
}
@RequestMapping(value = "booking/create", method = RequestMethod.POST)
public String createBookingAction(Booking booking) {
bookingService.addBooking(booking);
return "redirect:/bookings";
}
.....
private void initModelList(Model model) {
List<Restaurant> restaurantList = restaurantService.getRestaurants();
model.addAttribute("restaurants", restaurantList);
}
这是我的 jsp 文件:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html lang="en">
<jsp:include page="../fragments/head.jsp"/>
<body>
<jsp:include page="../fragments/menu.jsp"/>
<div id="body">
<h2>Create new booking</h2>
<form:form method="POST" commandName="booking" class="bookingForm">
<table>
<tr>
<td>Restaurant:</td>
<td><form:select path="restaurant">
<form:option value="NONE" label="--- Select ---" />
<form:options items="${restaurants}" />
</form:select>
</td>
</tr>
<tr>
<td colspan="3"><input type="submit" /></td>
</tr>
</table>
</form:form>
<div>
<a href="/bookings">Back to List</a>
</div>
</div>
<jsp:include page="../fragments/footer.jsp"/>
</body>
</html>
现在,下拉菜单显示餐厅,但当我单击“提交”时,它会出现以下错误:客户端发送的请求在语法上不正确。
我认为这是因为 Booking 和 Restaurant 之间的映射有问题,但我不知道是什么问题。很抱歉这篇文章很长,感谢您的帮助。谢谢!
最佳答案
您的 Controller booking/create POST
期望您从 JSP 表单发送的请求中有一个有效的 Booking
对象。
你可以尝试改变
<form:select path="restaurant">
至
<form:select path="restaurant.restaurantName">
由于表单本身会将内容添加到预订对象,因此该字段将有效映射到 booking.restaurant.restaurantName
,这使其成为有效的 Booking 对象。
另请注意,此时您的 Controller 将获取一个预订对象,其中只有一个字段包含数据。在保存数据之前,您需要从数据库中获取相关对象的其余数据(例如 ids)。
关于java - Spring/Hibernate 和关系映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36206738/