错误Batch update returned unexpected row count from update [0]; actual row count: 0;

简介: 错误Batch update returned unexpected row count from update [0]; actual row count: 0;  把开发过程中碰到的BUG累积下来也是一笔财富。


 

把开发过程中碰到的BUG累积下来也是一笔财富。
网络收集:
Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
不注意的话,还真的有点无所适从,Batch update returned unexpected row count from update  [0]; actual row count: 0; expected:  1这个异常是由于主键设置为自增长,而在我们插入记录的时候设置了ID的值导致的。
Hibernate 注释@OneToOne 建立表关联实例

我的解决方案:
我是在做One-To-One级联 添加/更新  碰到的,开始还以为是我配置错误,后面经过仔细排查,发现是我在页面上写了子表ID的隐藏表单域,传到后面的时候value=""  ,不是value=null,所以执行的时候hibernate判断为更新,所以报错了。我的解决方案是把ID单独传到后台,然后用代码判断是否为空,然后进行更新或者增加。


下面是我的代码:
TranOrders.java(父类):

Java代码  收藏代码

  1. @Entity  
  2. @Table(name = "TSPRO_TRAN_ORDERS")  
  3. public class TranOrders implements java.io.Serializable {  
  4.  
  5.    // Fields      
  6.    private TranItem tranItem;  
  7.    private TranCar tranCar;  
  8.  
  9.    /** default constructor */  
  10.    public TranOrders() {  
  11.    }  
  12.  
  13.  
  14.    @OneToOne(cascade=CascadeType.ALL,mappedBy="tranOrders",fetch=FetchType.LAZY,optional = true)  
  15.    @JoinColumn(name="id",unique=true)  
  16.    public TranItem getTranItem() {  
  17.        return tranItem;  
  18.    }  
  19.  
  20.    public void setTranItem(TranItem tranItem) {  
  21.        this.tranItem = tranItem;  
  22.    }  
  23.  
  24.    @OneToOne(cascade=CascadeType.ALL,mappedBy="tranOrders",fetch=FetchType.LAZY,optional = true)  
  25.    @JoinColumn(name="id",unique=true)  
  26.    public TranCar getTranCar() {  
  27.        return tranCar;  
  28.    }  
  29.  
  30.    public void setTranCar(TranCar tranCar) {  
  31.        this.tranCar = tranCar;  
  32.    }  
  33.  
  34.  
  35. }  


TranItem.java(子类)

Java代码  收藏代码

  1. @Entity  
  2. @Table(name = "TSPRO_TRAN_ITEM")  
  3. public class TranItem implements java.io.Serializable {  
  4.  
  5.    // Fields      
  6.    private TranOrders tranOrders;  
  7.  
  8.    @OneToOne(fetch = FetchType.LAZY,optional=false)  
  9.    @JoinColumn(name = "TSP_ID",unique=true)  
  10.    public TranOrders getTranOrders() {  
  11.        return this.tranOrders;  
  12.    }  
  13.  
  14.    public void setTranOrders(TranOrders tranOrders) {  
  15.        this.tranOrders = tranOrders;  
  16.    }  
  17. }  


TranCar.java(子类)

Java代码  收藏代码

  1. @Entity  
  2. @Table(name = "TSPRO_TRAN_CAR")  
  3. public class TranCar implements java.io.Serializable {  
  4.  
  5.    // Fields      
  6.    private TranOrders tranOrders;  
  7.  
  8.    @OneToOne(fetch = FetchType.LAZY,optional=false)  
  9.    @JoinColumn(name = "TSP_ID",unique=true)  
  10.    public TranOrders getTranOrders() {  
  11.        return this.tranOrders;  
  12.    }  
  13.  
  14.    public void setTranOrders(TranOrders tranOrders) {  
  15.        this.tranOrders = tranOrders;  
  16.    }  
  17. }  


Action(调用):

Java代码  收藏代码

    1. public String saveTranOrders() {  
    2.        String tranItemId=super.getRequest().getParameter("tranItemId");  
    3.        String tranCarId=super.getRequest().getParameter("tranCarId");  
    4.        String loginUserId = (String) getSession().getAttribute(Constant.LOGIN_USER_ID);  
    5.          
    6.        //时间转换  
    7.        String loadSort=super.getRequest().getParameter("loadSort");  
    8.        String reachTime=super.getRequest().getParameter("reachTime");  
    9.        String wzdTime=super.getRequest().getParameter("wzdTime");  
    10.          
    11.        SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日HH时");  
    12.          
    13.          
    14.        try {  
    15.            if(tranOrders!=null){  
    16.                tranOrders.setLoadSort(new Timestamp(sdf.parse(loadSort).getTime()));  
    17.                tranOrders.setReachTime(new Timestamp(sdf.parse(reachTime).getTime()));  
    18.                tranOrders.setWzdTime(new Timestamp(sdf.parse(wzdTime).getTime()));  
    19.                if(BeanUtils.isNotEmpty(tranItemId)){  
    20.                    tranItem.setId(tranItemId);  
    21.                }  
    22.                if(BeanUtils.isNotEmpty(tranCarId)){  
    23.                    tranCar.setId(tranCarId);  
    24.                }  
    25.                  
    26.                tranCar.setTranOrders(tranOrders);  
    27.                tranOrders.setTranCar(tranCar);  
    28.                  
    29.                tranItem.setTranOrders(tranOrders);  
    30.                tranOrders.setTranItem(tranItem);  
    31.                  
    32.                if(BeanUtils.isNotEmpty(tranOrders.getId())){  
    33.                    tranOrders.setUpdateBy(loginUserId);  
    34.                    tranOrders.setUpdateDate(new Timestamp(System.currentTimeMillis()));  
    35.                    tranOrdersManager.update4ClearCurrSession(tranOrders);  
    36.                }  
    37.                  
    38.                tranOrders.setCreateBy(loginUserId);  
    39.                tranOrders.setCreateDate(new Timestamp(System.currentTimeMillis()));  
    40.                tranOrdersManager.save(tranOrders);  
    41.                writerPrint("1");  
    42.            }else  
    43.            writerPrint("0");  
    44.        } catch (Exception e) {  
    45.            e.printStackTrace();  
    46.            writerPrint("2");  
    47.        }  
    48.        return NONE;  
    49.  
    50.    }  
目录
相关文章
|
NoSQL Java Redis
Spring boot整合Redis实现发布订阅(超详细)
Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收信息。微信,微博,关注系统 Redis客户端可以订阅任意数量的频道
9127 0
Spring boot整合Redis实现发布订阅(超详细)
|
6月前
|
数据采集 人工智能 算法
“脏”数据毁一生?教你用大数据清洗术,给数据洗个“澡”!
“脏”数据毁一生?教你用大数据清洗术,给数据洗个“澡”!
583 4
|
存储 缓存 Unix
从原理到实践:掌握DPDK内存池技术(上)
从原理到实践:掌握DPDK内存池技术
|
存储 负载均衡 NoSQL
一文让你搞懂 zookeeper
一文让你搞懂 zookeeper
19624 16
|
编解码 前端开发 JavaScript
前端:Rem 及其转换原理
Rem是一种用于前端开发的相对字体大小单位,它基于根元素的字体尺寸来定义文本大小,有助于实现响应式布局和可维护性。Rem的转换原理是通过相对于HTML根元素的字体大小来设置子元素的字体大小,从而实现统一的比例调整,提高页面的适应性和灵活性。此方法简化了跨浏览器和设备的布局调整,增强了用户体验。
|
前端开发 JavaScript 开发者
前端JS按钮点击事件、跳出弹窗、遮罩的实战示例
本文提供了一个前端JS按钮点击事件、弹出式窗口和遮罩层的实战示例,包括HTML、CSS和JavaScript的具体实现代码,以及功能解析,演示了如何实现按钮点击后触发弹窗显示和遮罩层,并在2秒后自动关闭或点击遮罩层关闭弹窗的效果。
前端JS按钮点击事件、跳出弹窗、遮罩的实战示例
|
前端开发 数据库 JavaScript
基于Flowable的流程挂接自定义业务表单的设计与实践
文章讨论了如何在Flowable流程引擎中挂接自定义业务表单,以及相关设计和实践的步骤。文章中包含了一些前后端代码示例,如Vue组件的模板和脚本部分,这些代码用于实现与Flowable流程引擎交互的界面。例如,有一个按钮组件用于提交申请,点击后会触发applySubmit方法,该方法会与后端API进行交互,处理流程启动、查询关联流程等逻辑。
53971 11
|
存储 OLAP 数据处理
GaussDB技术解读——GaussDB架构介绍(三)
GaussDB技术解读——GaussDB架构介绍(三)
674 1
|
关系型数据库 数据库 PostgreSQL
PostgreSQL数据库的字符串拼接语法使用说明
【6月更文挑战第11天】PostgreSQL数据库的字符串拼接语法使用说明
1719 1
|
算法 API
DPDK-Hash(2)
DPDK-Hash(2)
478 0