Java Spring/Hibernate和关系映射
我对SpringMVC和Hibernate(以及一般的数据库)还不熟悉,所以希望得到一些帮助 目前我的数据库中有两张桌子——预订和餐厅。预订有一个外键Java Spring/Hibernate和关系映射,java,database,spring,hibernate,spring-mvc,Java,Database,Spring,Hibernate,Spring Mvc,我对SpringMVC和Hibernate(以及一般的数据库)还不熟悉,所以希望得到一些帮助 目前我的数据库中有两张桌子——预订和餐厅。预订有一个外键R\u id,它指向餐厅的主键。现在,我正在尝试实现一个下拉菜单,其中显示数据库中的所有餐厅,当用户选择一家餐厅时,该值在预订数据库中设置。我希望你明白我的意思 我的订票课: @Entity @Table(name="booking") public class Booking { @Id @Column(name="id")
R\u id
,它指向餐厅的主键。现在,我正在尝试实现一个下拉菜单,其中显示数据库中的所有餐厅,当用户选择一家餐厅时,该值在预订数据库中设置。我希望你明白我的意思
我的订票课:
@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;
}
}
主控制器中的相关方法:
@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);
}
@RequestMapping(value=“booking/create”,method=RequestMethod.GET)
公共字符串createBooking(模型){
model.addAttribute(“预订”,新预订());
初始模型列表(模型);
返回“newBooking”;
}
@RequestMapping(value=“booking/create”,method=RequestMethod.POST)
公共字符串createBookingAction(预订){
预订服务。添加预订(预订);
返回“重定向:/bookings”;
}
.....
私有void initModelList(模型){
List restaurantList=restaurantService.getRestaurants();
model.addAttribute(“餐厅”,餐厅列表);
}
这是我的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/create POST
希望从JSP表单发送的请求中包含有效的booking
对象
你可以试着换衣服
<form:select path="restaurant">
到
由于表单本身将向预订对象添加内容,因此此字段将有效地映射到booking.restaurant.restaurantName
,从而使其成为有效的预订对象
还要注意,此时控制器将获得一个booking对象,其中只有一个字段有数据。在保存数据之前,您需要从db(如ID)中获取相关对象的其余数据。您的控制器
booking/create POST
希望您从JSP表单发送的请求中包含有效的booking
对象
你可以试着换衣服
<form:select path="restaurant">
到
由于表单本身将向预订对象添加内容,因此此字段将有效地映射到booking.restaurant.restaurantName
,从而使其成为有效的预订对象
还要注意,此时控制器将获得一个booking对象,其中只有一个字段有数据。在保存数据之前,您需要从数据库(如ID)中获取相关对象的其余数据。考虑使用专用表单,这是一种很好的做法 在您的情况下,它将是一个名为
BookingAddForm
的专用用户类,具有原始数据类型,如Integer
和String
,包括包含操作所需的唯一信息的集合,在您的情况下是餐厅名称列表。因此,不需要复杂的对象列表绑定simple,而且一切都可以正常工作
之后,您可以在服务层轻松地处理它。从加载的数据中创建Hibernate实体,并根据需要进行处理。数据检索也是如此
在指定的代码处,您错过了将表单与控制器关联的
@modeldattribute
注释。应该是这样的:
@RequestMapping(value = "booking/create", method = RequestMethod.POST)
public String createBookingAction(@ModelAttribute @Valid BookingAddForm bookingAddForm, BindingResult br) {
// validation required!
bookingService.addBooking(bookingAddForm);
return "redirect:/bookings";
}
。。。还要注意,您不执行任何验证。你必须这样做,否则你的应用程序就不安全了
考虑使用专用表单,这是一种很好的做法 在您的情况下,它将是一个名为
BookingAddForm
的专用用户类,具有原始数据类型,如Integer
和String
,包括包含操作所需的唯一信息的集合,在您的情况下是餐厅名称列表。因此,不需要复杂的对象列表绑定simple,而且一切都可以正常工作
之后,您可以在服务层轻松地处理它。从加载的数据中创建Hibernate实体,并根据需要进行处理。数据检索也是如此
在指定的代码处,您错过了将表单与控制器关联的
@modeldattribute
注释。应该是这样的:
@RequestMapping(value = "booking/create", method = RequestMethod.POST)
public String createBookingAction(@ModelAttribute @Valid BookingAddForm bookingAddForm, BindingResult br) {
// validation required!
bookingService.addBooking(bookingAddForm);
return "redirect:/bookings";
}
。。。还要注意,您不执行任何验证。你必须这样做,否则你的应用程序就不安全了
可能是
id
,而不是restaurentName
,我有点困惑。。试试看,非常感谢你!我有点困惑,它可能不是restaurentName
,而是id
。。试试看,非常感谢你!