让实体对象自行决定留存操作类型(增删改)

本文中不考虑数据库并发的影响和缓存效率问题。

实体对象的留存指把对象改变保存回数据存储中,就数据库而言就是INSERT、UPDATE、DELETE。
1、从数据源加载的实体未发生改变,则不需执行留存操作。
2、新建的实体留存时执行INSERT。
3、从数据源加载的实体发生了改变,留存时执行UPDATE。
4、客户端决定删除某实体时,执行DELETE。

留存操作的决定者
1、客户端可以充当留存操作的决定者,在UI层实现,需要客户端根据判断调用不同的增删改方法。不推荐。
2、(推荐)实体自身也可以充当留存操作的决定者,在领域层实现,这让实体不再是简单的贫血模型,但这样的设计使得系统智能化程度相对较高,UI层只需要简单的调用一个保存方法,不必关心留存的细节。推荐。

实体对象自行决定留存操作
1、调用的保存方法

ModelService.Save(Model model);

2、保存方法中根据Model的PresistanceMode属性决定留存行为。
3、Model实现IEntity接口,而PresistanceMode是该接口上的一个只读属性。
4、PresistanceMode被定义为一个枚举。该定义与IEntity接口定义在一起。

public enum PersistanceMode { None, Insert, Update, Delete }

实体留存的判断方法
1、实体通过三个标记来判断PresistanceMode,这三个标记定义为三个字段。

protected bool isNew = false;
protected bool isModified = false;
protected bool isRemoved = false;

2、就三者的组合来判断PresistanceMode
3、isRemoved最简单,可交由客户端设定即可。
4、isNew相对简单,有两种方法实现。
其一,查询法,在实体留存时,以实体标识查询数据存储,没找到的设置isNew = true。
其二,初始赋值法,在实体创建时,区分实体是新建抑或加载即可,本文讨论这一方法。
5、isModified比较复杂,有两种方法实现。
其一,过程法,改变属性通过统一的ChangeProperty方法(过程)来完成,在其中设定isModified值。应完成集合属性的改变属性方法。
其二,比较法,实体保存初始值,通过比较初始值来判断并设定isModified值。

实体留存判断的复杂性
1、实体新建后保存,PresistanceMode.Insert。
2、实体新建、删除后保存,PresistanceMode.None。
3、实体新建、修改后保存,PresistanceMode.Insert。
4、实体新建、修改、删除后保存,PresistanceMode.None。
5、实体加载、无修改、未删除,保存,PresistanceMode.None。
6、实体加载、修改后保存,PresistanceMode.Update。
7、实体加载、修改、删除后保存,PresistanceMode.Delete。
8、实体加载、无修改、删除后保存,PresistanceMode.Delete。

public PersistanceMode PersistanceMode
        {
            get { return this.GetPersistanceMode(); }
        }

/// <summary>
        /// 根据实体字段的值,推断实体的留存方式
        /// </summary>
        /// <returns></returns>
        private PersistanceMode GetPersistanceMode()
        {
           if (this.isNew)
            {
               if (this.isRemoved)
                {
                   /* None*/
                }
               else
                {
                   if (this.isModified) {return PersistanceMode.Insert;   /* Insert*/
                    }
                   else
                    {
                       /* None*/
                    }
                }
            }
           else
            {
               if (this.isRemoved)
                {
                   if (this.isModified)
                    {
                       return PersistanceMode.Delete;   /* Delete*/
                    }
                   else
                    {
                       return PersistanceMode.Delete;   /* Delete*/
                    }
                }
               else
                {
                   if (this.isModified)
                    {
                       return PersistanceMode.Update;   /* Update*/
                    }
                   else
                    {
                       /* None*/
                    }
                }
            }
           return PersistanceMode.None;
        }

让实体对象自行决定留存操作类型(增删改)

时间: 2025-01-07 14:15:30

让实体对象自行决定留存操作类型(增删改)的相关文章

Bmob移动后端云服务平台--Android从零开始--(三)Bmob数据操作((批量)增删改)

Bmob移动后端云服务平台--Android从零开始--(三)Bmob数据操作((批量)增删改) 上篇文章简单的利用Bmob实现了用户注册与登录效果(http://blog.csdn.net/a123demi/article/details/42059621). 在项目中,对数据的操作脱离不了增删改查.Bmob其实也一样,他对数据操作的增删改查做了很好的封装,以及其批量的处理.本文将重点讲解利用Bmob实现Android端与Bmob服务端的数据操作,实现增加.修改.删除以及他们的批量处理. 源码

Redis简单的数据操作(增删改查)

#Redis简单的数据操作(增删改查): 字符串类型 string 1. 存储: set key value 127.0.0.1:6379> set username zhangsan OK 2. 获取: get key 127.0.0.1:6379> get username "zhangsan" 以下同理: 127.0.0.1:6379> set age 23 OK 127.0.0.1:6379> get age "23" 127.0.0

js操作indexedDB增删改查示例

js操作indexedDB增删改查示例 if ('indexedDB' in window) { // 如果数据库不存在则创建,如果存在但是version更大,会自动升级不会复制原来的版本 var req = indexedDB.open("TestDB", 1); req.onupgradeneeded = function(e) { var db = req.result; // var store = db.createObjectStore("student"

java操作数据库增删改查的小工具--TxQueryRunner

在java程序中,一般使用jdbc连接数据库,比较麻烦,在看传智教程时学了一个工具类,用于简化与数据库之间的操作步骤,就是TxQueryRunner,他是QueryRunner的子类,用起来和他是一样的,特点是支持事务,使用时需要导入几个jar包,分别是 : 这个工具类的优点基本上就是阿帕奇出的DBUtils框架里边所具有的特点,极大简化操作者的代码量,底层使用c3p0连接池,可以方便的吧数据库查询出来的结果映射到JavaBean,List,Map等中,以下是笔记及代码: import java

Djaogo-Model操作数据库(增删改查、连表结构)

一.数据库操作 1.创建model表 基本结构 1 2 3 4 5 6 from django.db import models    class userinfo(models.Model):     #如果没有models.AutoField,默认会创建一个id的自增列     name = models.CharField(max_length=30)     email = models.EmailField()     memo = models.TextField() 更多字段: 1

Django-Model操作数据库(增删改查、连表结构)

一.数据库操作 1.创建model表 基本结构 1 from django.db import models 2 3 class userinfo(models.Model): 4 #如果没有models.AutoField,默认会创建一个id的自增列 5 name = models.CharField(max_length=30) 6 email = models.EmailField() 7 memo = models.TextField() 更多字段: 1.models.AutoField

hibernate_06_单表操作_增删改操作

首先,创建类对象 1 package com.imooc.hibernate; 2 3 public class Address { 4 5 private String postcode; //邮编 6 private String phone; //电话 7 private String address; //地址 8 9 public Address() {}; 10 11 public String getPostcode() { 12 return postcode; 13 } 14

javascript操作xml(增删改查)例子代码

包括了stu.hta(是HTML应用程序);      stu.xml 注意下面的HTML代码必须保存为后缀名为hta否则当对XML文件进行操作(增删改)的时候就会提示没有权限!! 文件stu.hta代码如下: 代码 <html><head><title> 数据岛的显示 </title><style type="text/css">#findPanel{ position:absolute; width:220px; bord

Java操作MongoDB增删改查完美Demo

--因为实习工作需要,在学MongoDB,参考了公司的一个MongDB服务类,写了一个整合的Demo,涉及到的大部分的增删改查操作,而且还算规范,给大家参考!源代码:(完整项目文件下载链接:点击打开链接)http://download.csdn.net/detail/zhangliangzi/9555872 使用说明: 一.MongoDB数据库参数配置 1.推荐使用mongodb.cfg.properties配置,则在构造MongoDBService对象的时候只需调用无参构造方法即可自动完成配置