2016-03-31 4 views
0

У меня есть две таблицы в моей базе данных - ресторан и ресторан. Между ними существует связь @OneToMany (в ресторане может быть много таблиц). Я пытаюсь добавить стол в свой ресторан. Я могу добавить первую таблицу, но как только я пытаюсь добавить еще одну таблицу он дает мне следующую ошибку:Несколько представлений одного и того же объекта объединяются (спящий режим)

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalStateException: Multiple representations of the same entity [RestaurantTable#6] are being merged. Detached: [Table number 6]; Detached: [Table number 5] 

Это как моя база данных выглядит следующим образом:

DROP TABLE IF EXISTS `restaurant`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `restaurant` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `restaurant_name` TEXT, 
    `address` TEXT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 
/*!40101 SET character_set_client = @saved_cs_client */; 

DROP TABLE IF EXISTS `restaurant_table`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
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=6 DEFAULT CHARSET=utf8; 
/*!40101 SET character_set_client = @saved_cs_client */; 

Мой Restaurant.java файл:

@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(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinColumn(name="restaurant_id") 
    private List<RestaurantTable> table = new ArrayList<RestaurantTable>(); 

    // Getters and setters 

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 

Мои RestaurantTableController.java:

@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, @PathVariable Long id) { 
     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) { 
     Restaurant restaurant = restaurantService.getRestaurant(id); 
     table.setRestaurant(restaurant); 
     restaurant.getTable().add(table); 
     restaurantService.updateRestaurant(restaurant); 
     return "redirect:/bookings"; 
    } 

} 

И мой updateRestaurant() метод в RestaurantDaoImpl.java:

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

Любая помощь приветствуется!

EDIT: версия Hibernate, которую я использую, является 4.3.6.

Кроме того, изменил мой ресторан таблицы декларации:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER , mappedBy = "restaurant") 
private List<RestaurantTable> table = new ArrayList<RestaurantTable>(); 

И это дает мне ту же ошибку, как и раньше.

EDIT: Я читал, что одно решение для того, чтобы изменить Cascade.ALL не включать MERGE, так что код будет выглядеть следующим образом:

@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.DETACH, CascadeType.REFRESH}, fetch = FetchType.EAGER , mappedBy = "restaurant") 
private List<RestaurantTable> table = new ArrayList<RestaurantTable>(); 

Это не дает мне ошибку, но это просто ничего не делает, ничего не меняется.

ответ

-1

Ваш ресторан -> РесторанТабличные отношения управляются с двух сторон. Только одна сторона отношений может быть владельцем отношений. В этом случае RestaurantTable должен быть владельцем отношения, так как его таблица будет иметь внешний ключ для другой таблицы.

Необходимо изменить свойство стола ресторана, чтобы указать, что отношения управляются рестораном RestaurantTable. JPA теперь будет использовать это свойство для сохранения.

Изменить объявление свойства в

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER , mappedBy = "restaurant") 
private List<RestaurantTable> table = new ArrayList<RestaurantTable>(); 
+0

Спасибо за ваш ответ. Я попробовал, и теперь это дает мне ту же ошибку, что и раньше. – charliekelly

Смежные вопросы