2016-04-02 88 views
0

我在我的數據庫中有3個表格 - Booking,Restaurant和RestaurantTable。現在我試圖創建一個新的預訂,並且其中一個步驟是添加一個表格。但是,當我嘗試添加該表下面的錯誤出現:org.hibernate.LazyInitializationException(Spring/Hibernate)

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role 

這是我的餐廳類:

@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; 

    @OneToMany(mappedBy = "restaurant") 
    private Set<RestaurantTable> table; 

    // Getters and setters 

我可以改變「表」來FetchType.EAGER,但導致其他問題。 我RestaurantTable類:

@Entity 
@Table(name="restaurant_table") 
public class RestaurantTable { 

    @Id 
    @Column(name="id") 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    private Long id; 

    @Column(name="table_size") 
    private Integer tableSize; 

    @Column(name="table_number") 
    private Integer tableNumber; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name="restaurant_id") 
    private Restaurant restaurant; 

    // Getters and setters. 

我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"; 
} 

這個.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> 

任何幫助表示讚賞!

回答

1

重構ResturantTable並刪除此類提取類型

@ManyToOne   
    @JoinColumn(name="restaurant_id") 
    private Restaurant restaurant; 

加入Resturant

@OneToMany(mappedBy = "restaurant",fetch = FetchType.LAZY) 
private Set<RestaurantTable> table; 

獲取類型,並添加此行您bookingService類方法getBooking(id)爲initalize所有數據

booking.getRestaurant().getTable().size(); 

booking您的服務方法getBooking(id)返回對象

+0

感謝您的回覆。我這樣做,仍然得到同樣的錯誤。 – charliekelly

+0

@charliekellyI編輯我的答案 –

+0

謝謝,它的工作! – charliekelly

1

以懶惰模式加載相關實體意味着實體會在第一次訪問時加載,前提是會話應該是開放且有效的。

會話關閉時訪問項目拋出LazyInitializationException

確保您在會話打開時訪問項目或將獲取類型模式從惰性更改爲渴望(默認)。

相關問題