2016-04-02 21 views
0

私のデータベースには、Booking、Restaurant、RestaurantTableという3つのテーブルがあります。今すぐ新しい予約を作成しようとしていますが、そこにはテーブルを追加するステップがあります。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; 

タイプをフェッチこのクラスのタイプを取得し、initalizeこの行をあなたのbookingServiceクラスメソッドgetBooking(id)を追加、削除

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

bookingサービスメソッドgetBooking(id)戻りオブジェクト

+0

ご返信ありがとうございます。私はそれをしても、同じエラーが発生します。 – charliekelly

+0

@charliekellyı私の答えを編集 –

+0

ありがとう、それは働いた! – charliekelly

1

関連エンティティを遅延モードでロードすると、セッションが開いて有効であることを条件に、エンティティが初めてアクセスされたときに読み込まれます。

セッションが閉じられたときにアイテムにアクセスすると、LazyInitializationExceptionがスローされます。

セッションが開いているときにアイテムにアクセスするか、フェッチタイプモードをlazyからeager(デフォルト)に変更してください。

関連する問題