java - Spring/Hibernate 和关系映射

标签 java database spring hibernate spring-mvc

我是 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/

相关文章:

java - 内部类中基于类型参数的类型声明

c# - 在数据库中存储枚举的最佳方法

c# - 具有无限参数的参数化 SQL 查询

java - Spring security 4 @PreAuthorize(hasAuthority()) 访问被拒绝

java - Spring Boot - 连接到 Neo4j 和 MySQL 数据源

我的 Spring MVC 3.2 应用程序中的 JSON 映射仅适用于我的一种方法

java - 将 Coinbase Exchange API 库添加到 Eclipse 项目时出现问题

java - 无法使用 JDBC 驱动程序连接到 Salesforce

java - 如何从 servlet 获取下拉列表的 Selected INDEX?

php - 将值从 View 页面传递到 codeigniter 中的 Controller 页面