save()方法很顯然是執行儲存操作的,如果是對一個新的剛new出來的對象進行儲存,自然要使用這個方法了,資料庫中沒有這個對象。
update()如果是對一個已經存在的托管對象進行更新那麼肯定是要使用update()方法了,資料中有這個對象。
saveOrUpdate()這個方法是更新或者插入,有主鍵就執行更新,如果沒有主鍵就執行插入。
上面的解釋是沒有問題的,但是當我實際用的時候,老以為有saveOrUpdate不就行了。可以忽略掉save和update方法了,、、、
還是太天真了。。。。
似的,不遇到問題,永遠不會想為什麼還是會有save update
經驗還是如此重要
[java] view plain copy
- 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;
- @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="";
- private String MsgType="";
- private String DataType="string";
- private String Content = "";
- private String MsgSelector = "";
- 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;
- }
- @Column(name="MsgType",length=50)
- public String getMsgType() {
- return MsgType;
- }
- public void setMsgType(String msgType) {
- MsgType = msgType;
- }
- @Column(name="CreateTime",length=40)
- public String getCreateTime() {
- return CreateTime;
- }
- public void setCreateTime(String createTime) {
- CreateTime = createTime;
- }
- @Column(name="DataType",length=10)
- public String getDataType() {
- return DataType;
- }
- 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還是有存在的必要 了。。。。