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