天天看點

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. import java.io.Serializable;  
  3. import java.util.List;  
  4. import javax.persistence.Column;  
  5. import javax.persistence.Entity;  
  6. import javax.persistence.GeneratedValue;  
  7. import javax.persistence.Id;  
  8. import javax.persistence.Table;  
  9. import org.hibernate.annotations.GenericGenerator;  
  10. @Entity  
  11. @Table(name="Base_Message")  
  12. public class BaseMessage implements Serializable{  
  13.     private static final long serialVersionUID = 1L;  
  14.     private String Id;  
  15.     private String FromType="";  
  16.     private String CreateTime="";   
  17.     private String MsgType="";    
  18.     private String DataType="string";  
  19.     private String Content = "";  
  20.     private String MsgSelector = "";  
  21.     private String Cron = "";   
  22.     private long Period = 0;     
  23.     private int Repeat  = 0;    
  24.     private long Delay = 0;  //延遲投遞的時間  
  25.     @Id  
  26.     @GeneratedValue(generator = "system-uuid")  
  27.     @GenericGenerator(name = "system-uuid", strategy = "assigned")  
  28.     @Column(length = 100, name = "id")  
  29.     public String getId() {  
  30.         return Id;  
  31.     }  
  32.     public void setId(String id) {  
  33.         Id = id;  
  34.     }  
  35.     @Column(name="MsgType",length=50)  
  36.     public String getMsgType() {  
  37.         return MsgType;  
  38.     }  
  39.     public void setMsgType(String msgType) {  
  40.         MsgType = msgType;  
  41.     }  
  42.     @Column(name="CreateTime",length=40)  
  43.     public String getCreateTime() {  
  44.         return CreateTime;  
  45.     }  
  46.     public void setCreateTime(String createTime) {  
  47.         CreateTime = createTime;  
  48.     }  
  49.     @Column(name="DataType",length=10)  
  50.     public String getDataType() {  
  51.         return DataType;  
  52.     }  
  53.     public void setDataType(String dataType) {  
  54.         DataType = dataType;  
  55.     }  
  56.     @Column(name = "Content",columnDefinition="CLOB")  
  57.     public String getContent() {  
  58.         return Content;  
  59.     }  
  60.     public void setContent(String content) {  
  61.         Content = content;  
  62.     }  
  63.     @Column(name = "MsgSelector",length=50)  
  64.     public String getMsgSelector() {  
  65.         return MsgSelector;  
  66.     }  
  67.     public void setMsgSelector(String msgSelector) {  
  68.         MsgSelector = msgSelector;  
  69.     }  
  70.     @Column(name = "Cron",length=30)  
  71.     public String getCron() {  
  72.         return Cron;  
  73.     }  
  74.     public void setCron(String cron) {  
  75.         Cron = cron;  
  76.     }  
  77.     @Column(name = "FromType",length=30)  
  78.     public String getFromType() {  
  79.         return FromType;  
  80.     }  
  81.     public void setFromType(String fromType) {  
  82.         FromType = fromType;  
  83.     }  
  84.     @Column(name = "Period")  
  85.     public long getPeriod() {  
  86.         return Period;  
  87.     }  
  88.     public void setPeriod(long period) {  
  89.         Period = period;  
  90.     }  
  91.     @Column(name = "Repeat")  
  92.     public int getRepeat() {  
  93.         return Repeat;  
  94.     }  
  95.     public void setRepeat(int repeat) {  
  96.         Repeat = repeat;  
  97.     }  
  98.     @Column(name = "Delay")  
  99.     public long getDelay() {  
  100.         return Delay;  
  101.     }  
  102.     public void setDelay(long delay) {  
  103.         Delay = delay;  
  104.     }  
  105. }  

pojo類如上,似乎沒有什麼特别的,但是細心的同學會發現,BaseMessage主鍵的配置設定政策是 assigned

也就是儲存一個對象的時候,主鍵由我來配置設定,這下。。。

BaseMessage baseMessage = new BaseMessage();

就是一個完整的對象了,主鍵也有     但是我們的需求是儲存到資料庫中  按照之前的思維,用saveOrupdate。。然後,看資料庫中根本就沒有資料,沒有存進去。。。。。我去。。再回來看上面三條解釋。瞬間懂了。。。

saveOrUpdate 是有主鍵(在對象中中查找)就會執行update ,然後 update XX  where  id=xx ,然後update受影響的行沒有。。。。因為where id=xx找不到的資料在資料庫中,,,而我們想要的結果就是insert (save)。。。此時懂了,當你的對象id是自己配置設定的,就不要用saveOrUpdate儲存了。。。。這下就知道save還是有存在的必要 了。。。。

繼續閱讀