Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring/Hibernate和关系映射_Java_Database_Spring_Hibernate_Spring Mvc - Fatal编程技术网

Java Spring/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")

我对SpringMVC和Hibernate(以及一般的数据库)还不熟悉,所以希望得到一些帮助

目前我的数据库中有两张桌子——预订和餐厅。预订有一个外键
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
。。试试看,非常感谢你!