2016-03-29 6 views
1

Im Moment habe ich 3 Tabellen in meiner Datenbank - Booking, Restaurant und RestaurantTable. Ich habe eine Eins-zu-viele-Zuordnung zwischen Restaurant und RestaurantTabelle (ein Restaurant kann viele Tische haben, aber ein Tisch kann nur ein Restaurant haben). Ich habe eine Datei namens "newTable.jsp", die neue Tabellen in das Restaurant einfügt. Aber wenn ich versuche zu tun, dass es mir die folgende Störung gibt:Batch-Update hat unerwartete Zeilenanzahl von Update (Spring/Hibernate) zurückgegeben

Request processing failed; nested exception is org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 

Ich denke, es versucht, einen RestaurantTable zuzugreifen, die noch nicht existiert? Aber ich weiß nicht, wie ich das beheben soll.

Hier ist meine "Restaurant.java" Klasse:

@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", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set<RestaurantTable> table; 

    // Getters and setters 

Mein "RestaurantTable.java":

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

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

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

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

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

    // Getters and setters 

Mein "newTable.jsp"

<body> 
<jsp:include page="../fragments/menu.jsp"/> 
<div id="body"> 
    <section class="content-wrapper main-content clear-fix"> 

     <h2>Add New Table</h2> 

     <form:form method="POST" commandName="table" modelAttribute="table"> 
      <table> 
       <tr> 
        <td>Table size:</td> 
        <td><form:input path="tableSize" /></td> 
       </tr> 
       <tr> 
        <td>Table number:</td> 
        <td><form:input path="tableNumber" /></td> 
       </tr> 
       <tr> 
        <td colspan="3"><input type="submit" /> 
        </td> 
       </tr> 
      </table> 
     </form:form> 

    </section> 
</div> 
<jsp:include page="../fragments/footer.jsp"/> 

</body> 

Mein RestaurantTableController :

@Controller 
public class RestaurantTableController { 


    @Autowired 
    private RestaurantService restaurantService; 

    @Autowired 
    private RestaurantTableService restaurantTableService; 

    @RequestMapping(value="restaurant/table/{id}", method = RequestMethod.GET) 
    public String addRestaurantTable(Model model) { 
     model.addAttribute("table", new RestaurantTable()); 
     return "newTable"; 
    } 

    @RequestMapping(value = "restaurant/table/{id}", method = RequestMethod.POST) 
    public String addRestaurantTable(@PathVariable Long id, @ModelAttribute ("table") RestaurantTable table) { 
     // Get a Restaurant object and add the table to it. 
     Restaurant restaurant = restaurantService.getRestaurant(id); 
     Set<RestaurantTable> tableSet = restaurant.getTable(); 
     tableSet.add(table); 
     restaurant.setTable(tableSet); 
     restaurantService.updateRestaurant(restaurant); 
     return "editRestaurant"; 
    } 

} 

Die {id} in RestaurantTableController ist eine Restaurant ID, sie wird von "editRestaurant.jsp" weitergeleitet. Jede Hilfe wird geschätzt.

EDIT: Meine updateRestaurant Methode:

@Override 
public void updateRestaurant(Restaurant restaurant) { 
    Session session = this.sessionFactory.getCurrentSession(); 
    session.update(restaurant); 
    logger.info("Restaurant record updated successfully, Restaurant Details=" + restaurant); 
} 
+0

zeigen die updateRestaurant Methode, bitte – itpr

+0

@itpr ich meinen Beitrag bearbeitet. Danke fürs Helfen! – charliekelly

Antwort

1

RestaurantTable Unternehmen verfügen nicht-ID zu dieser Zeit, so wirft Ausnahme winter. Versuchen Sie, verwenden merge Methode anstelle von update

update

Update the persistent instance with the identifier of the given detached instance. If there is a persistent instance with the same identifier, an exception is thrown.

Verwandte Themen