私のデータベースにはレストランとレストランテーブルが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>();
それは私にエラーを与えるものではありませんが、それただ何もしない、何も変化していない。
にプロパティ宣言は、あなたの答えをいただき、ありがとうございます。私はそれを試して、今私に前と同じエラーを与える。 – charliekelly