gpt4 book ai didi

java - 在一对多映射中向数据库添加行(Hibernate/Spring)

转载 作者:行者123 更新时间:2023-11-29 11:37:30 27 4
gpt4 key购买 nike

编辑:仍然没有解决方案:/

我真的需要一些帮助来解决我已经坚持了三天的事情。我有一个包含两个表的数据库,设置如下:

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=1 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=1 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

这两个表之间存在一对多映射(就像在餐厅中可以有许多表一样)。我正在尝试在我的餐厅中添加一张 table ,但似乎无法做到这一点(或者有时我无法添加一张以上的 table )。

如果有人能指出我正确的方向或帮助我找出代码中到底出了什么问题,我将非常感激。我已经尝试过不同的级联选项和更新而不是合并,但似乎从未让它发挥作用。我认为我的代码中可能存在根本性错误,也许我的整个做法都是错误的?

我的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, mappedBy="restaurant")
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/{id}/table", method = RequestMethod.GET)
public String addRestaurantTable(Model model, @PathVariable Long id) {
model.addAttribute("table", new RestaurantTable());
return "newTable";
}

@RequestMapping(value = "restaurant/{id}/table", 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.mergeRestaurant(restaurant);
return "redirect:/bookings";
}

}

还有 RestaurantDaoImpl.java 中的 mergeRestaurant() 方法:

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

我现在得到的错误是:

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]

感谢任何帮助!

编辑:已更改

private List<RestaurantTable> table = new ArrayList<RestaurantTable>();

private Set<RestaurantTable> table = new HashSet<RestaurantTable>();

此外,我没有将“CascadeType.ALL”放在 Restaurant 中,而是将其移至 RestaurantTable.java。

现在,如果我尝试将第一个 table 输入餐厅,则会出现以下错误:

HTTP Status 500 - Request processing failed; nested exception is org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [RestaurantTable#6]

有什么想法吗?

最佳答案

首先,您的映射是正确的。请不要再尝试了。一件事:我想要一个 @ManyToOne 部分作为惰性部分。但这当然不是必需的。

@Entity
@Table(name="restaurant")
public class Restaurant {

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

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

}

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

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="restaurant_id")
private Restaurant restaurant;

}

看起来,您没有正确处理 session (或事务)。

您的 mergeRestaurant() 方法看起来正确(也许,我会将 merge() 更改为 saveOrUpdate())。所以问题出在其他方面。尝试使用另一种方法。

您可以通过外键关联 RestaurantTable — 要添加 RestaurantTable,您无需更新 Restaurant。您只需要 Restaurant id。尝试更简单的方法

public void addTable(Long restaurantId, RestaurantTable table) {
Session session = this.sessionFactory.getCurrentSession();
Restaurant restaurant = (Restaurant)session.load(Restaurant.class, restaurantId);
table.setRestaurant(restaurant);
session.save(table);
}

session.load() 用于优化,它只是返回带有 restaurantId 的代理,而不访问数据库。您甚至可以尝试使用

table.setRestaurant(new Restaurant(restaurantId));

意思是一样的。

关于java - 在一对多映射中向数据库添加行(Hibernate/Spring),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36341770/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com