2016-03-31 4 views
0

私のデータベースにはレストランとレストランテーブルが2つあります。それらの間に@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:RestaurantDaoImpl.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()メソッドは:

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

そして、それは以前のように私に同じエラーを与えます。

編集:私はそのための一つの解決策は、MERGEを含まないようにCascade.ALLを変更することであることを読んで、そのコードは次のようになります。

@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レストランプロパティで関係が管理されていることを示すために、Restaurantテーブルプロパティを変更する必要があります。 JPAはそのプロパティを永続化するようになりました。

変更

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

にプロパティ宣言は、あなたの答えをいただき、ありがとうございます。私はそれを試して、今私に前と同じエラーを与える。 – charliekelly

関連する問題