hibernate save和update以及saveOrUpdate區別
阿新 • • 發佈:2019-01-30
save()方法很顯然是執行儲存操作的,如果是對一個新的剛new出來的物件進行儲存,自然要使用這個方法了,資料庫中沒有這個物件。
update()如果是對一個已經存在的託管物件進行更新那麼肯定是要使用update()方法了,資料中有這個物件。
saveOrUpdate()這個方法是更新或者插入,有主鍵就執行更新,如果沒有主鍵就執行插入。
上面的解釋是沒有問題的,但是當我實際用的時候,老以為有saveOrUpdate不就行了。可以忽略掉save和update方法了,、、、
還是太天真了。。。。
似的,不遇到問題,永遠不會想為什麼還是會有save update
經驗還是如此重要
package com.xky.activemq.pojo; import java.io.Serializable; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; /** * 訊息實體類 欄位只增加不刪減 <br> * ReceivedXmlMessage * @author genge 2015年11月18日 下午4:16:00 */ @Entity @Table(name="Base_Message") public class BaseMessage implements Serializable{ private static final long serialVersionUID = 1L; /*******************通用訊息欄位*********************/ /** * 唯一標識 */ private String Id; /** * 訊息來源 */ private String FromType=""; /** * 訊息建立的時間 */ private String CreateTime=""; /** * 訊息型別:app 、web、sms、wechat、group<br> * 其中格式為如上單一類別,特別注意為group時,將選擇群發,各個平臺都將收到訊息<br> */ private String MsgType=""; /** * 資料型別:string map object(Serializable),不設定預設為string */ private String DataType="string"; /** * 訊息內容(序列化json串,代表真實訊息) */ private String Content = ""; /** * 訊息攔截器:通過這個屬性的設定可以幫助接收者過濾訊息 */ private String MsgSelector = ""; /** * Cron表示式 定時傳送 優先順序最高 */ private String Cron = ""; /** * 重複投遞的時間間隔 */ private long Period = 0; /** * 重複投遞次數 */ private int Repeat = 0; /** * 傳送訊息延遲時間 */ private long Delay = 0; //延遲投遞的時間 @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "assigned") @Column(length = 100, name = "id") public String getId() { return Id; } public void setId(String id) { Id = id; } /** * 訊息型別 * @return String 訊息型別 * @author genge 2015年11月18日 下午3:39:23 */ @Column(name="MsgType",length=50) public String getMsgType() { return MsgType; } /** * 訊息型別 * @param msgType 訊息型別 * @author genge 2015年11月18日 下午3:39:59 */ public void setMsgType(String msgType) { MsgType = msgType; } /** * 訊息建立的時間 * @return * @author genge 2015年11月18日 下午3:43:38 */ @Column(name="CreateTime",length=40) public String getCreateTime() { return CreateTime; } /** * 訊息建立的時間 * @param createTime * @author genge 2015年11月18日 下午3:43:53 */ public void setCreateTime(String createTime) { CreateTime = createTime; } /** * 資料型別 * @return * @author genge 2015年11月18日 下午3:44:02 */ @Column(name="DataType",length=10) public String getDataType() { return DataType; } /** * 資料型別 * @param dataType * @author genge 2015年11月18日 下午3:44:09 */ public void setDataType(String dataType) { DataType = dataType; } @Column(name = "Content",columnDefinition="CLOB") public String getContent() { return Content; } public void setContent(String content) { Content = content; } @Column(name = "MsgSelector",length=50) public String getMsgSelector() { return MsgSelector; } public void setMsgSelector(String msgSelector) { MsgSelector = msgSelector; } @Column(name = "Cron",length=30) public String getCron() { return Cron; } public void setCron(String cron) { Cron = cron; } @Column(name = "FromType",length=30) public String getFromType() { return FromType; } public void setFromType(String fromType) { FromType = fromType; } @Column(name = "Period") public long getPeriod() { return Period; } public void setPeriod(long period) { Period = period; } @Column(name = "Repeat") public int getRepeat() { return Repeat; } public void setRepeat(int repeat) { Repeat = repeat; } @Column(name = "Delay") public long getDelay() { return Delay; } public void setDelay(long delay) { Delay = delay; } }
pojo類如上,似乎沒有什麼特別的,但是細心的同學會發現,BaseMessage主鍵的分配策略是assigned
也就是儲存一個物件的時候,主鍵由我來分配,這下。。。
BaseMessage baseMessage = new BaseMessage();
就是一個完整的物件了,主鍵也有 但是我們的需求是儲存到資料庫中 按照之前的思維,用saveOrupdate。。然後,看資料庫中根本就沒有資料,沒有存進去。。。。。我去。。再回來看上面三條解釋。瞬間懂了。。。
saveOrUpdate 是有主鍵(在物件中中查詢)就會執行update ,然後 update XX where id=xx ,然後update受影響的行沒有。。。。因為where id=xx找不到的資料在資料庫中,,,而我們想要的結果就是insert (save)。。。此時懂了,當你的物件id是自己分配的,就不要用saveOrUpdate儲存了。。。。這下就知道save還是有存在的必要 了。。。。