搞了两天了,这个错误还是没有解决?

搞了两天了,这个错误还是没有解决?

1、在测试ShopService时,可以正常插入数据数据

public class ShopServiceTest extends BaseTest {

    @Resource
    private ShopService shopService;

    @Test
    public void testAddShop() throws FileNotFoundException {
        Shop shop = new Shop();

        Person person = new Person();
        person.setUserId(1L);
        ShopCategory shopCategory = new ShopCategory();
        shopCategory.setShopCategoryId(7L);
        Area area = new Area();
        area.setAreaId(2);

        shop.setShopName("咖啡馆");
        shop.setShopDesc("test2");
        shop.setShopAddress("test2");
        shop.setShopPhone("test2");

        shop.setPriority(0);
        shop.setAdvice("审核中");
        shop.setEnableStatus(ShopStateEnum.CHECK.getState());
        shop.setCreateTime(new Date());
        shop.setLastEditTime(new Date());
        shop.setOwner(person);

        shop.setShopCategory(shopCategory);
        shop.setArea(area);

        File shopImg = new File("C:/Users/CD4356/Desktop/1.jpg");
        InputStream input = new FileInputStream(shopImg);
        ShopExecution shopExecution = shopService.addShop(shop,input,shopImg.getName());
        assertEquals(ShopStateEnum.CHECK.getState(),shopExecution.getState());
    }
}

http://img1.sycdn.imooc.com//climg/5d9f5f90097e5b2917350062.jpg

-----------------------------------------------------------------------------------------------------------------

2、但在前端点击提交按钮的时候,就报下面这个错了,我看了几十遍代码了,都还是发现找不到到底是哪里出错了,打断点测试也测试不出来,(百度说这是外键关联问题,但我在测试ShopService的时候是可以插入数据的)

错误信息:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.RuntimeException: addShop error: 
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`o2o`.`shop`, CONSTRAINT `fk_area_id` FOREIGN KEY (`area_id`) REFERENCES `area` (`area_id`))
### The error may exist in file [D:\tomcat\apache-tomcat-9.0.16\webapps\o2o\WEB-INF\classes\mapper\ShopDao.xml]
### The error may involve com.cd.store.dao.ShopDao.insertShop-Inline
### The error occurred while setting parameters
### SQL: insert into shop(shop_name,shop_desc,shop_address,shop_phone,shop_img,priority,advice,enable_status,         create_time,last_edit_time,owner_id,shop_category_id,area_id)         values         (?,?,?,?,?,?,?,?,          ?,?,?,?,?)
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`o2o`.`shop`, CONSTRAINT `fk_area_id` FOREIGN KEY (`area_id`) REFERENCES `area` (`area_id`))
; SQL []; Cannot add or update a child row: a foreign key constraint fails (`o2o`.`shop`, CONSTRAINT `fk_area_id` FOREIGN KEY (`area_id`) REFERENCES `area` (`area_id`)); nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`o2o`.`shop`, CONSTRAINT `fk_area_id` FOREIGN KEY (`area_id`) REFERENCES `area` (`area_id`))
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
	org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

--

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cd.store.dao.ShopDao">


    <insert id="insertShop" useGeneratedKeys="true" keyColumn="shop_id" keyProperty="shopId" parameterType="Shop">
        insert into shop(shop_name,shop_desc,shop_address,shop_phone,shop_img,priority,advice,enable_status,
        create_time,last_edit_time,owner_id,shop_category_id,area_id)
        values
        (#{shopName},#{shopDesc},#{shopAddress},#{shopPhone},#{shopImg},#{priority},#{advice},#{enableStatus},
         #{createTime},#{lastEditTime},#{owner.userId},#{shopCategory.shopCategoryId},#{area.areaId})
    </insert>

    <update id="updateShop" parameterType="Shop">
        update shop
        <set>
            <if test="shopName != null">shop_name=#{shopName},</if>
            <if test="shopDesc != null">shop_desc=#{shopDesc},</if>
            <if test="shopAddress != null">shop_address=#{shopAddress},</if>
            <if test="shopPhone != null">shop_phone=#{shopPhone},</if>
            <if test="shopImg != null">shop_img=#{shopImg},</if>
            <if test="priority != null">priority=#{priority},</if>
            <if test="advice != null">advice=#{advice},</if>
            <if test="enableStatus != null">enable_status=#{enableStatus},</if>
            <if test="createTime != null">create_time=#{createTime},</if>
            <if test="lastEditTime != null">last_edit_time=#{lastEditTime},</if>
            <if test="shopCategory != null">shop_category_id=#{shopCategory.shopCategoryId},</if>
            <if test="area != null">area_id=#{area.areaId}</if>
        </set>
        where shop_id=#{shopId}
    </update>

</mapper>

--

public class PathUtil {

    //获取文件分隔符
    private static String separator = System.getProperty("file.separator");

    public static String getImgBasePath(){
        //获取系统名称
        String os = System.getProperty("os.name");

        String basePath = "";

        if(os.toLowerCase().startsWith("win")){
            basePath = "D:/idea/java_workspace/image/";
        }else {
            basePath = "home/shop/image/";
        }
        basePath = basePath.replace("/",separator);
        return basePath;
    }

    public static String getShopImagePath(Long shopId){
        String imagePath = "upload/shop/"+ shopId +"/";
        return imagePath.replace("/",separator);
    }

}

--

public class ImageUtil {

    //类路径资源目录
    private static String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
    //时间格式
    private static SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
    //随机类
    private static Random random = new Random();

    /**
     * 将CommonsMultiFile转化成File
     * @param file
     * @return
     */
    public static File transferCommonsMultipartFileToFile(CommonsMultipartFile file){
        //创建File文件对象
        File newFile = new File(file.getOriginalFilename());
        try {
            //将传入文件的文件流写入新创建的文件中
            file.transferTo(newFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return newFile;
    }


    /**
     * 生成缩略图,并返回新生产图片的相对路径
     * @param thumbnailInputStream
     * @param targetAddr
     * @return
     */
    public static String generateThumbnail(InputStream thumbnailInputStream, String fileName, String targetAddr){
        //获取文件随机名称
        String realFileName = getRandomFileName();
        //获取文件扩展名(后缀名)
        String extension = getFileExtension(fileName);
        //创建目标目录
        makeDirsPath(targetAddr);
        //拼接文件相对路径
        String relativeAddr = targetAddr + realFileName + extension;
        //新生产的文件的绝对路径
        File dest = new File(PathUtil.getImgBasePath()+relativeAddr);
        try {
            Thumbnails.of(thumbnailInputStream)
                      .size(200,200)
                      .watermark(Positions.BOTTOM_RIGHT,ImageIO.read(new File(basePath + "/watermark.jpg")),0.5f)
                      .outputQuality(0.8f)
                      .toFile(dest);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return relativeAddr;
    }

    /**
     * 创建目标路径所涉及到的目录, 如 D:/tmp/one/two/xxx.jpg , 那么/tmp/one/two这三个文件夹都得自动创建
     * @param targetAddress
     */
    private static void makeDirsPath(String targetAddress) {
        //获取文件全路径 ~ ~ 全路径 = 根路径 + 相对路径
        String fileParentPath = PathUtil.getImgBasePath() + targetAddress;
        //获取文件全路径目录
        File dirPath = new File(fileParentPath);
        //判断目录是否存在,不存在就创建该目录
        if(!dirPath.exists()){
            dirPath.mkdirs();
        }
    }

    /**
     * 获取文件扩展名
     * @param filename
     * @return
     */
    private static String getFileExtension(String filename) {
        //获取原始文件扩展名
        String fileExtension = filename.substring(filename.lastIndexOf("."));
        return fileExtension;
    }


    /**
     * 生产随机文件名 ~ ~ 当前的(年月日时分秒 +5位随机数)
     * @return
     */
    public static String getRandomFileName() {
        //获取10000~99999之间的5位随机数
        int randomNumber = random.nextInt(99999) + 10000;
        //获取当前时间,并按指定时间格式返回
        String nowTime = format.format(new Date());
        String randomFileName = nowTime + randomNumber;
        return randomFileName;
    }

}

--

@Service("shopService")
public class ShopServiceImpl implements ShopService {

    @Autowired
    private ShopDao shopDao;

    @Transactional(propagation = Propagation.REQUIRED)
    public ShopExecution addShop(Shop shop, InputStream shopImgInputStream, String fileName) {
        if(shop==null){
            return new ShopExecution(ShopStateEnum.NULL_SHOP);
        }
        try {
            //给店铺信息赋初始值
            shop.setPriority(0);
            shop.setAdvice("审核中");
            shop.setEnableStatus(ShopStateEnum.CHECK.getState());
            shop.setCreateTime(new Date());
            shop.setLastEditTime(new Date());
            //1、添加店铺信息
            int effectNum = shopDao.insertShop(shop);
            if(effectNum<=0){
                //抛出RunTimeException异常(或继承了RunTimeException的子类异常),事务会进行回滚,
                //(如果是抛出Exception异常,事务不会进行回滚)
                throw new RuntimeException("店铺创建失败!");
            }else{
                if(shopImgInputStream != null){
                    //2、存储图片
                    try{
                        addShopImg(shop, shopImgInputStream,fileName);
                    }catch (Exception e){
                        throw new RuntimeException("addShopImg error: " + e.getMessage());
                    }
                    //3、更新店铺的图片地址
                    effectNum = shopDao.updateShop(shop);
                    if(effectNum<=0){
                        //抛出RunTimeException异常(或继承了RunTimeException的子类异常),事务会进行回滚,
                        //(如果是抛出Exception异常,事务不会进行回滚)
                        throw new RuntimeException("更新店铺的图片地址失败!");
                    }
                }
            }
        }catch (Exception e){
            throw new RuntimeException("addShop error: " + e.getMessage());
        }

        return new ShopExecution(ShopStateEnum.CHECK,shop);
    }

    private void addShopImg(Shop shop, InputStream shopImgInputStream, String fileName) {
        //获取shop图片目录的相对路径
        String dest = PathUtil.getShopImagePath(shop.getShopId());
        //生成缩略图,并返回新生产图片的相对路径
        String shopImgAddr = ImageUtil.generateThumbnail(shopImgInputStream,fileName,dest);
        //设置shop图片地址
        shop.setShopImg(shopImgAddr);
    }
}

--

@Controller
@RequestMapping("/shop_admin")
public class ShopManagementController {

    @Autowired
    private ShopService shopService;
    @Autowired
    private ShopCategoryService shopCategoryService;
    @Autowired
    private AreaService areaService;

    /**
     * 获取店铺分类和区域信息,(然后通过Ajax获取这些信息,进行页面的局部刷新)
     * @return
     */
    @RequestMapping("/get_shop_info")
    @ResponseBody
    private Map<String,Object> getShopInfo(){
        Map<String,Object> map = new HashMap<String, Object>();
        try{
            List<ShopCategory> shopCategoryList = shopCategoryService.getShopCategoryList(new ShopCategory());
            List<Area> areaList = areaService.getAreaList();
            map.put("shopCategoryList",shopCategoryList);
            map.put("areaList",areaList);
            map.put("success",true);
        }catch (Exception e){
            map.put("success",false);
            map.put("error:",e.getMessage());
        }
        return map;
    }


    /**
     * 注册店铺
     * @param request
     * @return
     */
    @RequestMapping("/register_shop")
    @ResponseBody
    private Map<String,Object> registerShop(HttpServletRequest request){
        Map<String,Object> map = new HashMap<String, Object>();
        if(!VerifyCodeUtil.checkVerifyCode(request)){
            map.put("success",false);
            map.put("errorMsg","验证码错误!");
            return map;
        }
        //1、接收并转化相应的参数, 包括店铺信息和图片信息
        String shopStr = HttpServletRequestUtil.getString(request,"shopStr");
        ObjectMapper mapper = new ObjectMapper();
        Shop shop = null;
        try{
            shop = mapper.readValue(shopStr,Shop.class);
        }catch (Exception e){
            map.put("success",false);
            map.put("errorMsg",e.getMessage());
            return map;
        }

        CommonsMultipartFile shopImg = null;
        CommonsMultipartResolver commonsMultipartResolver =
                new CommonsMultipartResolver(request.getSession().getServletContext());
        if(commonsMultipartResolver.isMultipart(request)){
            MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
            shopImg = (CommonsMultipartFile) multipartHttpServletRequest.getFile("shopImg");
        }else{
            map.put("success",false);
            map.put("errorMsg","上传图片不能为空!");
            return map;
        }

        //2、注册店铺
        if(shop != null && shopImg !=null){
            Person person = new Person();
            person.setUserId(1L);
            shop.setOwner(person);
            ShopExecution shopExecution = null;
            try {
                shopExecution = shopService.addShop(shop,shopImg.getInputStream(),shopImg.getOriginalFilename());
                if(shopExecution.getState()== ShopStateEnum.CHECK.getState()){
                    map.put("success",true);
                }else{
                    map.put("success",false);
                    map.put("errorMsg",shopExecution.getStateInfo());
                }
            } catch (IOException e) {
                map.put("success",false);
                map.put("errorMsg",e.getMessage());
            }
            return map;
        }else{
            map.put("success",false);
            map.put("errorMsg","店铺信息不能为空!");
            return map;
        }
    }
}

--

$(function () {
    var initUrl = '/o2o/shop_admin/get_shop_info';
    var registerShopUrl = '/o2o/shop_admin/register_shop';

    getShopInitInfo();

    function getShopInitInfo() {
        //$表示jquery对象,例如$.post(),$.get(),$.ajax()等这些都是jquery这个对象的方法
        $.getJSON(initUrl,function (data) {
            if(data.success){
                var tempHtml = '';
                var tempAreaHtml = '';

                data.shopCategoryList.map(function(item,index) {
                    tempHtml += '<option data-id="' + item.shopCategoryId + '">'
                    + item.shopCategoryName + '</option>';
                });

                data.areaList.map(function(item,index) {
                    tempAreaHtml += '<option data-id="' + item.areaId + '">'
                        + item.areaName + '</option>';
                });

                $('#shop-category').html(tempHtml);
                $('#area').html(tempAreaHtml);
            }
        });


        $('#submit').click(function () {
            var shop = {};
            shop.shopName = $('#shop-name').val();
            shop.shopAddress = $('#shop-address').val();
            shop.shopPhone = $('#shop-phone').val();
            shop.shopDesc = $('#shop-desc').val();
            shop.shopCategory = {
                shopCategoryId : $('#shop-category').find('option').not(function(){
                    return !this.selected;
                }).data('id')
            };
            shop.area = {
                areaId : $('#shop-category').find('option').not(function(){
                    return !this.selected;
                }).data('id')
            };
            var shopImg = $('#shop-img')[0].files[0];
            var verifyCode = $('#j_captcha').val();
            var formData = new FormData();
            if(!verifyCode){
                $.toast('请输入验证码');
                return;
            }
            formData.append('verifyCode',verifyCode);
            formData.append('shopImg',shopImg);
            formData.append('shopStr',JSON.stringify(shop));

            $.ajax({
                url: registerShopUrl,
                type: 'POST',
                data: formData,
                contentType: false,
                processData: false,
                cache: false,
                success: function(data){
                    if(data.success){
                        $.toast('提交成功!');
                    }else{
                        $.toast('提交失败!'+data.errMsg);
                    }
                    //进行提交后,不管成功还是失败,都对验证码进行更新
                    $('#captcha_img').click();
                }
            });

        });

    }
});

--

public class VerifyCodeUtil {

    public static boolean checkVerifyCode(HttpServletRequest request){
        //获取生产的验证码
        String verifyCodeGenerated = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
        //获取实际提交的验证码
        String verifyCodeActual = HttpServletRequestUtil.getString(request,"verifyCode");
        //判断实际提交的验证码是否与生产的验证码是否一致
        if(verifyCodeActual == null && !verifyCodeActual.equals(verifyCodeGenerated)){
            return false;
        }
        return true;
    }
}

--

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 1、导入spring-service.xml配置文件 -->
    <import resource="classpath:spring/spring-service.xml"/>

    <!--2、自动扫描web包-->
    <context:component-scan base-package="com.cd.store.web"/>

    <!--3、开启spring mvc注解模式-->
    <mvc:annotation-driven/>

    <!--4、静态资源默认servlet配置:
            1、加入对静态资源(js、css、jpg、png、git等. . .)
            2、允许使用'/'做整体映射-->
    <!--即: resources目录下的静态资源不要用DispatcherServlet去拦截,
        而是,交由默认servlet(<mvc:default-servlet-handler/>)来处理-->
    <mvc:resources mapping="/resources/**" location="/resources/"/>
    <!--默认servlet-->
    <mvc:default-servlet-handler/>

    <!--5、配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--视图前缀-->
        <property name="prefix" value="/WEB-INF/html/"/>
        <!--视图后缀-->
        <property name="suffix" value=".html"/>
    </bean>

    <!--文件上传解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"/>
        <!-- 上传文件的最大字节数  1024个字节为1kB, 1024kB为1M
                1024*1024*10 = 10M , 上传文件的大小不能超过10M-->
        <property name="maxUploadSize" value="10485760"/>
        <!-- 最大内存也限制为10M -->
        <property name="maxInMemorySize" value="10485760"/>
    </bean>

</beans>

--

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 验证码相关属性的配置 -->
    <servlet>
        <servlet-name>Kaptcha</servlet-name>
        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
        <!-- 定义 Kaptcha 的样式 -->
        <!-- 是否有边框 -->
        <init-param>
            <param-name>kaptcha.border</param-name>
            <param-value>no</param-value>
        </init-param>
        <!-- 字体颜色 -->
        <init-param>
            <param-name>kaptcha.textproducer.font.color</param-name>
            <param-value>red</param-value>
        </init-param>
        <!-- 图片宽度 -->
        <init-param>
            <param-name>kaptcha.image.width</param-name>
            <param-value>135</param-value>
        </init-param>
        <!-- 图片高度 -->
        <init-param>
            <param-name>kaptcha.image.height</param-name>
            <param-value>50</param-value>
        </init-param>
        <!-- 使用哪些字符生成验证码 -->
        <init-param>
            <param-name>kaptcha.textproducer.char.string</param-name>
            <param-value>ACDEFHKPRSTWX3456975</param-value>
        </init-param>
        <!-- 字体大小 -->
        <init-param>
            <param-name>kaptcha.textproducer.font.size</param-name>
            <param-value>43</param-value>
        </init-param>
        <!-- 干扰线的颜色 -->
        <init-param>
            <param-name>kaptcha.noise.color</param-name>
            <param-value>black</param-value>
        </init-param>
        <!-- 字符个数 -->
        <init-param>
            <param-name>kaptcha.textproducer.char.length</param-name>
            <param-value>4</param-value>
        </init-param>
        <!-- 字体 -->
        <init-param>
            <param-name>kaptcha.textproducer.font.names</param-name>
            <param-value>Arial</param-value> <!--Arial是宋体字-->
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>Kaptcha</servlet-name>
        <!-- 外部访问路径 -->
        <url-pattern>/Kaptcha</url-pattern>
    </servlet-mapping>

    <!--前置控制器 -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--加载spring-web.xml配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/spring-web.xml</param-value>
        </init-param>
    </servlet>
    <!--配置servlet映射关系,将servlet与url绑定,通过别名匹配来绑定-->
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!--拦截所有路径型请求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

--

function changeVerifyCode(img) {
    img.src = "../Kaptcha?" + Math.floor(Math.random() * 100);
}

--

CREATE TABLE `area` (
  `area_id` int(4) NOT NULL AUTO_INCREMENT COMMENT '区域id',
  `area_name` varchar(100) NOT NULL COMMENT '区域名称',
  `priority` int(3) NOT NULL DEFAULT '0' COMMENT '权重/优先级',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `last_edit_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`area_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO `area` VALUES ('1', '爱联', '1', '2019-10-02 23:33:32', '2019-10-10 16:40:10');
INSERT INTO `area` VALUES ('2', '荷坳', '2', '2019-10-03 02:34:08', '2019-10-10 16:40:14');

--

CREATE TABLE `person` (
  `user_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '个人id',
  `name` varchar(32) DEFAULT NULL COMMENT '姓名',
  `profile_img` varchar(1024) DEFAULT NULL COMMENT '头像地址',
  `email` varchar(1024) DEFAULT NULL COMMENT '邮箱',
  `gender` varchar(2) DEFAULT NULL COMMENT '性别',
  `enable_status` int(2) NOT NULL DEFAULT '0' COMMENT '0:禁止使用本商城,1:允许使用本商城',
  `person_type` int(2) NOT NULL DEFAULT '1' COMMENT '1:顾客, 2:商家, 3:超级管理员',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `last_edit_time` datetime DEFAULT NULL COMMENT '最近更新时间',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO `person` VALUES ('1', '张三', 'test', 'test', '男', '0', '2', '2019-10-05 20:33:43', '2019-10-05 20:33:49');

--

CREATE TABLE `shop_category` (
  `shop_category_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '店铺类别id',
  `shop_category_name` varchar(20) NOT NULL DEFAULT '' COMMENT '店铺类别名称',
  `shop_category_desc` varchar(1000) DEFAULT '' COMMENT '店铺类别简介',
  `shop_category_img` varchar(1000) DEFAULT NULL COMMENT '店铺类别图片',
  `priority` int(2) NOT NULL DEFAULT '0' COMMENT '店铺类别权重',
  `create_time` datetime DEFAULT NULL COMMENT '店铺类别创建时间',
  `last_edit_time` datetime DEFAULT NULL COMMENT '店铺类别最近更新时间',
  `parent_id` int(11) DEFAULT NULL COMMENT '店铺类别上级分类id',
  PRIMARY KEY (`shop_category_id`),
  KEY `fk_parentId` (`parent_id`),
  CONSTRAINT `fk_parentId` FOREIGN KEY (`parent_id`) REFERENCES `shop_category` (`shop_category_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

INSERT INTO `shop_category` VALUES ('5', '美容美发', '一级分类', null, '1', '2019-10-09 02:05:58', '2019-10-09 02:06:01', null);
INSERT INTO `shop_category` VALUES ('6', '美食饮品', '一级分类', null, '1', '2019-10-09 02:06:32', '2019-10-09 02:06:48', null);
INSERT INTO `shop_category` VALUES ('7', '咖啡', '二级分类', null, '0', '2019-10-09 02:07:53', '2019-10-09 02:07:58', '6');
INSERT INTO `shop_category` VALUES ('8', '自助餐', '二级分类', null, '0', '2019-10-09 16:04:10', '2019-10-09 16:04:13', '6');

--

CREATE TABLE `shop` (
  `shop_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '店铺id',
  `shop_name` varchar(20) DEFAULT NULL COMMENT '//店铺名称',
  `shop_desc` varchar(1000) DEFAULT NULL COMMENT '店铺描述',
  `shop_address` varchar(100) DEFAULT NULL COMMENT '店铺地址',
  `shop_phone` varchar(20) DEFAULT NULL COMMENT '商家电话',
  `shop_img` varchar(100) DEFAULT NULL COMMENT '店铺图片',
  `priority` int(3) DEFAULT '0' COMMENT '权重',
  `advice` varchar(1000) DEFAULT NULL COMMENT '超级管理员给商家的提醒',
  `enable_status` int(2) DEFAULT '0' COMMENT '店铺状态 -1:不可用 0:审核 1:可用',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `last_edit_time` datetime DEFAULT NULL COMMENT '最近更新时间',
  `owner_id` int(10) NOT NULL COMMENT '店铺创建人',
  `shop_category_id` int(11) DEFAULT NULL COMMENT '店铺类别',
  `area_id` int(4) DEFAULT NULL COMMENT '店铺所属区域',
  PRIMARY KEY (`shop_id`),
  KEY `fk_owner_id` (`owner_id`),
  KEY `fk_area_id` (`area_id`),
  KEY `fk_shop_category_id` (`shop_category_id`),
  CONSTRAINT `fk_area_id` FOREIGN KEY (`area_id`) REFERENCES `area` (`area_id`),
  CONSTRAINT `fk_owner_id` FOREIGN KEY (`owner_id`) REFERENCES `person` (`user_id`),
  CONSTRAINT `fk_shop_category_id` FOREIGN KEY (`shop_category_id`) REFERENCES `shop_category` (`shop_category_id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;

INSERT INTO `shop` VALUES ('18', '咖啡馆', 'test2', 'test2', 'test2', 'upload\\shop\\18\\2019101100133427562.jpg', '0', '审核通过', '1', '2019-10-11 00:13:34', '2019-10-11 00:13:34', '1', '7', '2');

--


添加店铺的代码我已尽可能的贴出来了,麻烦老师仔细看一下,谢谢老师。

再找不到错误我就要奔溃了

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,

报错的原因,的确是由于外键导致的,非常理解同学的心情,接下来慢慢的找一下原因,找错也是一种学习和成长~~

经过老师测试同学的代码,是可以正常插入的呢,看同学贴出来的数据库的数据,如果插入的area为2也是正确的。建议同学按以下思路排查一下。

  1. 数据插入之前,打断点查看一下shop.area.areaId是什么

    http://img1.sycdn.imooc.com//climg/5d9ffeff09fc6d8415100625.jpg

  2. 查看一个数据库中area中是否存在id为这个值的数据。

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 暗淡冬天 提问者 #1
    我思考的方向错误了,debug看到area中有获取到值就跳过了,没有考虑到这个值是错误的,根据老师的提示回去看了一下Ajax内容,发现是area的id写错了,写成和shopCategory的id一样了,现已解决,谢谢老师
    2019-10-11 16:33:52
Lair 2019-10-11 08:01:33

你那SQL语句显示外键关联错误,你看看是不是语句引用了关联表不存在的 ID

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师