1. 程式人生 > >hibernate save和update以及saveOrUpdate區別

hibernate save和update以及saveOrUpdate區別

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還是有存在的必要 了。。。。