2016-04-02 10 views
1

私のデータベースには、Booking、Restaurant、RestaurantTableという3つのテーブルがあります。今すぐ新しい予約を作成しようとしていますが、そこにはテーブルを追加するステップがあります。私はこのテーブルを追加しようとすると、次のエラーがアップします:それはそのエラーを与える理由は、私が追加しようとしているテーブルは(私は少なくとも考える)NOT NULLであることから、私は、知らないプリミティブ型エラー(Spring/Hibernate)にNULL値を割り当てることができません

org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @javax.persistence.Column int for value 'null'; nested exception is java.lang.IllegalArgumentException: A null value cannot be assigned to a primitive type 

。私が何を意味するのかご理解いただきたいと思います。

、データベース内のマイブッキングテーブル:データベース内

CREATE TABLE `booking` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `R_id` int(11) NOT NULL, 
    `date` date not null, 
    `start` TEXT, 
    `duration` float(3,1), 
    `amount_of_people` int, 
    `name` TEXT, 
    `contact_preference` TEXT, 
    `phone_number` TEXT, 
    `comments` TEXT, 
    `current_datetime` datetime default current_timestamp, 
    `new_date` datetime default current_timestamp, 
    `deleted` bool default false, 
    `edited` bool default false, 
    `table_number` int, 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`R_id`) references `restaurant`(`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 
/*!40101 SET character_set_client = @saved_cs_client */; 

マイRestaurantTable:

CREATE TABLE `restaurant_table` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `table_size` int, 
    `table_number` int, 
    `restaurant_id` int(11), 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`restaurant_id`) references `restaurant`(`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 
/*!40101 SET character_set_client = @saved_cs_client */; 

私は予約に追加しようとしているテーブルの.jspファイル:

<body> 
<jsp:include page="../fragments/menu.jsp"/> 
<div id="body"> 
    <h2>Create new booking</h2> 

    <form:form method="POST" modelAttribute="booking" > 
     <table> 
      <tr> 
       <td>Choose a table*:</td> 
       <td><form:select path="tableNumber"> 
         <form:option value="" label="--- Select ---" /> 
         <form:options items="${tables}" itemValue="tableNumber" itemLabel="tableNumber"/> 
       </form:select> 
      </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> 

BookingController.javaの関連メソッド:

@RequestMapping(value = "booking/create/{id}", method = RequestMethod.GET) 
public String chooseTable(@PathVariable Long id, Model model) { 
    Booking booking = bookingService.getBooking(id); 
    Restaurant restaurant = booking.getRestaurant(); 
    Set<RestaurantTable> tableSet = restaurant.getTable(); 
    model.addAttribute("tables", tableSet); 
    model.addAttribute("booking", booking); 
    return "chooseTable"; 
} 

@RequestMapping(value = "booking/create/{id}", method = RequestMethod.POST) 
public String chooseTableAction(@PathVariable Long id, Model model) { 
    return "redirect:/bookings"; 
} 

今のところ、予約コントローラのPOSTメソッドは、それ以前にもエラーが表示されるため、何もしません。

ご協力いただきましてありがとうございます。

答えて

2

Valueオブジェクトにプリミティブ型(int、long ...など)ではなく、オブジェクト型(Integer、Long ...など)としてフィールドを宣言する必要があります。

プリミティブ型に「null」はありません。あなたの値オブジェクトのプリミティブフィールドにnull値をマッピングしているようですので、Springはそれをあなたのために変換できません。

2

コードに問題があります。Booking.javaのtableNumberフィールドはint型ですが、jspには次のものがあります。

<form:option value="" label="--- Select ---" /> 

これは基本的に選択ドロップダウンから値がスプリングがプリミティブ型にヌルを変換する方法は、したがって、それはページの読み込み自体にそのような例外をスローしなかった場合にはnullにすることができることを意味します。

1>値を空白のオプションにvalue = " - 1"のような値を使用して変更し、それに応じてアプリケーションロジックで-1を処理します。

<form:option value="-1" label="--- Select ---" /> 

2>その他のオプションは、tableNumberフィールドをintではなくInteger型に宣言することです。

関連する問題