添加菜品时,无法正常插入
业务层
@Override
@Transactional
public void add(DishDTO dishDTO) {
Dish dish = new Dish();
//将dishdto的属性复制给dish
BeanUtils.copyProperties(dishDTO, dish);
dishMapper.add(dish);
//获取菜品id
Long dishId = dish.getId();
//获取口味
List<DishFlavor> flavors = dishDTO.getFlavors();
if (flavors.size() > 0) {
flavors.forEach(dishFlavor -> {
dishFlavor.setDishId(dishId);
});
//插入数据
dishFlavorMapper.addFlavor(flavors);
}
}
mapper层
添加菜品
@AutoFill(value = OperationType.INSERT)
void add(Dish dish);
<insert id="add">
insert into dish(name, category_id, price, image, description, status, create_time, update_time, create_user, update_user)
VALUES (#{name},#{categoryId},#{price},#{image},#{description},#{status},#{createTime},#{updateTime},#{createUser},#{updateUser})
</insert>
添加口味
void addFlavor(List<DishFlavor> flavors);
<insert id="addFlavor">
insert into dish_flavor(dish_id, name, value)
VALUES
<foreach collection="flavors" item="df" separator=",">
(#{df.dishId},#{df.name},#{df.value})
</foreach>
</insert>
错误原因:
添加菜品之后,获取不到主键id,数据库中添加菜品语句后,没有自动将自增长值赋值给对象 的属性id
使用@Transactional,保持事务的一致性。由于dishFlavorMapper.addFlavor(flavors);没有添加成功,所以 dishMapper.add(dish); 没有添加成功。
解决方案:
在Mapper文件中添加属性 “useGeneratedKeys”和“keyProperty”
<insert id="add" useGeneratedKeys="true" keyProperty="id">
insert into dish(name, category_id, price, image, description, status, create_time, update_time, create_user, update_user)
VALUES (#{name},#{categoryId},#{price},#{image},#{description},#{status},#{createTime},#{updateTime},#{createUser},#{updateUser})
</insert>