Hibernate 多对多关联出现报错情况---Batch update returned unexpected row count from update

来源:互联网 发布:盐城大数据产业园简介 编辑:程序博客网 时间:2024/05/17 22:00
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.     }  
0 0