2016-03-24 13 views
0

私はSpring MVCとHibernate(そして一般的なデータベース)を使い慣れていますので、いくつかの助けが必要です。Spring/Hibernateとリレーショナルマッピング

現在、私のデータベースには2つのテーブルがあります - 予約とレストラン。予約には、Restaurantの主キーを指す外部キーR_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); 

    } 

そして、ここに私の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> 

今のドロップダウンメニューにはレストランが表示されますが、私はクリックしたときに、それは私にこのエラーが発生します提出:The request sent by the client was syntactically incorrect.

は私が予約とレストランの間のマッピングに問題があるからだと思いますが、私はしないでくださいそれが何であるかを知る。長いポストに申し訳ありません、どんな助けもありがとうございます。ありがとう!

答えて

1

コントローラbooking/create POSTは、あなたのJSPフォームから送信しているリクエストに有効なBookingオブジェクトが必要です。このフィールドは、効果的に有効な予約になりこれ、booking.restaurant.restaurantNameにマッピングされますので、フォーム自体は、予約オブジェクトに内容を追加しますので

あなたは

<form:select path="restaurant.restaurantName"> 

<form:select path="restaurant"> 

を変更してみてくださいオブジェクト。

また、この時点でコントローラは、データを持つフィールドが1つだけの予約オブジェクトを取得することにも注意してください。データを保存する前に、関連するオブジェクトの残りのデータをdb(idsのような)からフェッチする必要があります。

+0

代わりrestaurentName' 'で、それは' id'可能性があり、私は少し困惑している...両方 –

+1

はそんなにありがとうしてみてください! – charliekelly

1

専用のフォームを使用することを検討してください。それは良い方法です。

は、あなたのケースでは、それはあなたのケースレストラン名のリストで、あなたが操作のために必要なだけの情報が含まれているコレクションなど IntegerStringなどの生データ型の BookingAddFormという名前の専用のユーザークラス、だろう。したがって、複雑なオブジェクトリストバインディングは必要なく、すべて正常に動作します。

サービス層で簡単に処理できます。ロードしたデータからHibernateエンティティを作成し、必要に応じて処理します。データ取得のための同じ話。あなたがあなたのコントローラにフォームを関連付けるために@ModelAttribute注釈を見逃している、指定したコードで


。また、あなたが任意の検証を実行していない、注意してください...

@RequestMapping(value = "booking/create", method = RequestMethod.POST) 
public String createBookingAction(@ModelAttribute @Valid BookingAddForm bookingAddForm, BindingResult br) { 

    // validation required! 
    bookingService.addBooking(bookingAddForm); 

    return "redirect:/bookings"; 
} 

:それはこのようにする必要があります。あなたはそうしなければ、あなたのアプリは安全ではありません。

@Valid annotation

+0

ありがとうございました! – charliekelly

関連する問題