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;

/**
 * 消息实体类 字段只增加不删减 
* 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
* 其中格式为如上单一类别,特别注意为group时,将选择群发,各个平台都将收到消息
*/ 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还是有存在的必要 了。。。。

你可能感兴趣的:(hibernate)