hibernate save和update以及saveOrUpdate区别

save()方法很显然是执行保存操作的,如果是对一个新的刚new出来的对象进行保存,自然要使用这个方法了,数据库中没有这个对象。

update()如果是对一个已经存在的托管对象进行更新那么肯定是要使用update()方法了,数据中有这个对象。

saveOrUpdate()这个方法是更新或者插入,有主键就执行更新,如果没有主键就执行插入。


上面的解释是没有问题的,但是当我实际用的时候,老以为有saveOrUpdate不就行了。可以忽略掉save和update方法了,、、、

还是太天真了。。。。

似的,不遇到问题,永远不会想为什么还是会有save update   

经验还是如此重要

[java]  view plain  copy
  1. package com.xky.activemq.pojo;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. import javax.persistence.Column;  
  7. import javax.persistence.Entity;  
  8. import javax.persistence.GeneratedValue;  
  9. import javax.persistence.Id;  
  10. import javax.persistence.Table;  
  11.   
  12. import org.hibernate.annotations.GenericGenerator;  
  13.   
  14. /** 
  15.  * 消息实体类 字段只增加不删减 <br> 
  16.  * ReceivedXmlMessage 
  17.  * @author genge 2015年11月18日 下午4:16:00 
  18.  */  
  19. @Entity  
  20. @Table(name="Base_Message")  
  21. public class BaseMessage implements Serializable{  
  22.       
  23.     private static final long serialVersionUID = 1L;  
  24.       
  25.     /*******************通用消息字段*********************/  
  26.     /** 
  27.      * 唯一标识 
  28.      */  
  29.     private String Id;  
  30.     /** 
  31.      * 消息来源 
  32.      */  
  33.     private String FromType="";  
  34.     /** 
  35.      * 消息创建的时间 
  36.      */  
  37.     private String CreateTime="";   
  38.     /** 
  39.      * 消息类型:app 、web、sms、wechat、group<br> 
  40.      * 其中格式为如上单一类别,特别注意为group时,将选择群发,各个平台都将收到消息<br> 
  41.      */  
  42.     private String MsgType="";    
  43.     /** 
  44.      * 数据类型:string map  object(Serializable),不设置默认为string 
  45.      */  
  46.     private String DataType="string";  
  47.     /** 
  48.      * 消息内容(序列化json串,代表真实消息) 
  49.      */  
  50.     private String Content = "";  
  51.     /** 
  52.      * 消息拦截器:通过这个属性的设置可以帮助接收者过滤消息 
  53.      */  
  54.     private String MsgSelector = "";  
  55.       
  56.     /** 
  57.      * Cron表达式  定时发送  优先级最高 
  58.      */  
  59.     private String Cron = "";   
  60.     /** 
  61.      * 重复投递的时间间隔 
  62.      */  
  63.     private long Period = 0;     
  64.     /** 
  65.      * 重复投递次数 
  66.      */  
  67.     private int Repeat  = 0;    
  68.     /** 
  69.      * 发送消息延迟时间 
  70.      */  
  71.     private long Delay = 0;  //延迟投递的时间  
  72.       
  73.     @Id  
  74.     @GeneratedValue(generator = "system-uuid")  
  75.     @GenericGenerator(name = "system-uuid", strategy = "assigned")  
  76.     @Column(length = 100, name = "id")  
  77.     public String getId() {  
  78.         return Id;  
  79.     }  
  80.     public void setId(String id) {  
  81.         Id = id;  
  82.     }  
  83.     /** 
  84.      * 消息类型 
  85.      * @return String 消息类型 
  86.      * @author genge 2015年11月18日 下午3:39:23 
  87.      */  
  88.     @Column(name="MsgType",length=50)  
  89.     public String getMsgType() {  
  90.         return MsgType;  
  91.     }  
  92.     /** 
  93.      * 消息类型 
  94.      * @param msgType 消息类型 
  95.      * @author genge 2015年11月18日 下午3:39:59 
  96.      */  
  97.     public void setMsgType(String msgType) {  
  98.         MsgType = msgType;  
  99.     }  
  100.     /** 
  101.      * 消息创建的时间 
  102.      * @return 
  103.      * @author genge 2015年11月18日 下午3:43:38 
  104.      */  
  105.     @Column(name="CreateTime",length=40)  
  106.     public String getCreateTime() {  
  107.         return CreateTime;  
  108.     }  
  109.     /** 
  110.      * 消息创建的时间 
  111.      * @param createTime 
  112.      * @author genge 2015年11月18日 下午3:43:53 
  113.      */  
  114.     public void setCreateTime(String createTime) {  
  115.         CreateTime = createTime;  
  116.     }  
  117.     /** 
  118.      * 数据类型 
  119.      * @return 
  120.      * @author genge 2015年11月18日 下午3:44:02 
  121.      */  
  122.     @Column(name="DataType",length=10)  
  123.     public String getDataType() {  
  124.         return DataType;  
  125.     }  
  126.     /** 
  127.      * 数据类型 
  128.      * @param dataType 
  129.      * @author genge 2015年11月18日 下午3:44:09 
  130.      */  
  131.     public void setDataType(String dataType) {  
  132.         DataType = dataType;  
  133.     }  
  134.     @Column(name = "Content",columnDefinition="CLOB")  
  135.     public String getContent() {  
  136.         return Content;  
  137.     }  
  138.     public void setContent(String content) {  
  139.         Content = content;  
  140.     }  
  141.     @Column(name = "MsgSelector",length=50)  
  142.     public String getMsgSelector() {  
  143.         return MsgSelector;  
  144.     }  
  145.     public void setMsgSelector(String msgSelector) {  
  146.         MsgSelector = msgSelector;  
  147.     }  
  148.     @Column(name = "Cron",length=30)  
  149.     public String getCron() {  
  150.         return Cron;  
  151.     }  
  152.     public void setCron(String cron) {  
  153.         Cron = cron;  
  154.     }  
  155.     @Column(name = "FromType",length=30)  
  156.     public String getFromType() {  
  157.         return FromType;  
  158.     }  
  159.     public void setFromType(String fromType) {  
  160.         FromType = fromType;  
  161.     }  
  162.     @Column(name = "Period")  
  163.     public long getPeriod() {  
  164.         return Period;  
  165.     }  
  166.     public void setPeriod(long period) {  
  167.         Period = period;  
  168.     }  
  169.     @Column(name = "Repeat")  
  170.     public int getRepeat() {  
  171.         return Repeat;  
  172.     }  
  173.     public void setRepeat(int repeat) {  
  174.         Repeat = repeat;  
  175.     }  
  176.     @Column(name = "Delay")  
  177.     public long getDelay() {  
  178.         return Delay;  
  179.     }  
  180.     public void setDelay(long delay) {  
  181.         Delay = delay;  
  182.     }  
  183. }  

pojo类如上,似乎没有什么特别的,但是细心的同学会发现,BaseMessage主键的分配策略是 assigned

也就是保存一个对象的时候,主键由我来分配,这下。。。

BaseMessage baseMessage = new BaseMessage();

就是一个完整的对象了,主键也有     但是我们的需求是保存到数据库中  按照之前的思维,用saveOrupdate。。然后,看数据库中根本就没有数据,没有存进去。。。。。我去。。再回来看上面三条解释。瞬间懂了。。。


saveOrUpdate 是有主键(在对象中中查找)就会执行update ,然后 update XX  where  id=xx ,然后update受影响的行没有。。。。因为where id=xx找不到的数据在数据库中,,,而我们想要的结果就是insert (save)。。。此时懂了,当你的对象id是自己分配的,就不要用saveOrUpdate保存了。。。。这下就知道save还是有存在的必要 了。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值