现在,我们一般都用关系数据库存储对象,用Hibernate或者ibatis将我们的对象与关系数据库中的表对应起来。也就是说,每次设计都需要进行对象到关系数据库的映射配置。
很烦琐啊。能不能有一种通用的对象存储机制呢?于是,就有了下面的想法。
一个对象由其类型(Class)和属性值组成。保存一个对象,就是要存储它的类型(这个简单)和它的属性。
1. 首先,建一个对象表,存储对象的ClassName和对象的id(我们要存储的对象应该都有ID).
CREATE TABLE dbobject(
obj_id BIGINT,
obj_type VARCHAR(255),
PRIMARY KEY(obj_id)
);
2. 然后,建一个属性表,用于存储对象的属性值。
CREATE TABLE dbproperty(
prop_id BIGINT,
prop_name VARCHAR(50),
long_value BIGINT,
double_value REAL,
boolean_value BOOLEAN,
date_value TIMESTAMP,
string_value VARCHAR(255),
byte_value LONGVARBINARY,
obj_id BIGINT,
PRIMARY KEY(prop_id),
CONSTRAINT dbproperty_fk_dbobject FOREIGN KEY (obj_id) REFERENCES dbobject(obj_id) ON DELETE CASCADE
);
这样,所有只拥有简单属性的对象就可以存储了。
3. 问题来了,一个对象可不是仅仅只有简单属性,还有复杂属性和集合。这就需要建一个关系表。
CREATE TABLE dbrelation(
relation_id BIGINT,
relation_name VARCHAR(50),
relation_type BIGINT,
obj_id BIGINT,
PRIMARY KEY(relation_id),
CONSTRAINT dbrelation_fk_dbobject FOREIGN KEY (obj_id) REFERENCES dbobject(obj_id) ON DELETE CASCADE
);
将对象表改成下面这个样子:
CREATE TABLE dbobject(
obj_id BIGINT,
obj_type VARCHAR(255),
relation_id BIGINT,
PRIMARY KEY(obj_id),
CONSTRAINT dbobject_fk_dbrelation FOREIGN KEY (relation_id) REFERENCES dbrelation(relation_id) ON DELETE CASCADE
);
这样,一个对象可以有多个关系,一个关系可以有多个对象。
对象间的关系可以定义如下:
ObjectRelationType.one
ObjectRelationType.list
ObjectRelationType.set
ObjectRelationType.map (map类型的key,对应dbobject表中的obj_name)
好了,成功解决对象复杂属性和集合属性。
最终表结构如下:
CREATE TABLE dbobject(
obj_id BIGINT,
obj_type VARCHAR(255),
relation_id BIGINT,
PRIMARY KEY(obj_id)
);
CREATE TABLE dbproperty(
prop_id BIGINT,
prop_name VARCHAR(50),
long_value BIGINT,
double_value REAL,
boolean_value BOOLEAN,
date_value TIMESTAMP,
string_value VARCHAR(255),
byte_value LONGVARBINARY,
obj_id BIGINT,
PRIMARY KEY(prop_id)
);
CREATE TABLE dbrelation(
relation_id BIGINT,
relation_name VARCHAR(50),
relation_type BIGINT,
obj_id BIGINT,
PRIMARY KEY(relation_id)
);
ALTER TABLE dbobject add CONSTRAINT dbobject_fk_dbrelation FOREIGN KEY (relation_id) REFERENCES dbrelation(relation_id) ON DELETE CASCADE;
ALTER TABLE dbproperty add CONSTRAINT dbproperty_fk_dbobject FOREIGN KEY (obj_id) REFERENCES dbobject(obj_id) ON DELETE CASCADE;
ALTER TABLE dbrelation add CONSTRAINT dbrelation_fk_dbobject FOREIGN KEY (obj_id) REFERENCES dbobject(obj_id) ON DELETE CASCADE;
4.根据上面的表,建立Dao. 随便用什么工具, hibernate,ibatis, jdbcTemplate, 甚至jdbc都可以,这里只是提个想法,就不写了.
5.实现PersistService.
6.存储对象
//组装对象
Person tom=new Person("tom");
tom.setAge(11);
Address address=new Address();
address.setCountry("China");
address.setCity("Shenyang");
tom.setAddress(address);
Person jerry=new Person("jerry");
tom.addFriends(jerry);
//存储
tom=persistService.persist(tom);
//组装另一个对象
Car car=new Car("redFlag");
//存储
car=persistService.persist(car);
从上面的例句看,好像和Hibernate差不多啊.除了一点,我们不用配置对象与关系数据库的映射.
PersistService 存储一个对象的时候,先从内存中检索对象的定义,如果没有就通过反射得到对象的定义,然后按照对象定义,将对象的属性保存在数据库中.对象定义可以同时保存到一个xml文件,以便于系统启动的时候,重新找回对象定义.
都半夜了,收工睡觉.
分享到:
相关推荐
接下来,对象存储(Object Storage)作为一种新兴的存储技术,它允许数据以对象的形式存储,并包含关于该对象的元数据。与传统的块存储或文件存储相比,对象存储的优势在于易于水平扩展、管理大量数据以及处理非结构...
云计算是一种商业实现,源于计算科学的并行计算、分布式计算和网格计算概念。"云"作为虚拟化的计算资源池,承载各种工作负载,支持快速资源部署和任务调度,具备自我检测、监控和故障恢复能力。云计算的核心不仅在于...
开发者受到TodoList程序的启发,决定创建一个功能更全面的工具,包括四种不同类型的树节点:OnlyText、DetailText、OnlyFile和Folder,以满足不同类型的个人信息管理需求。 OnlyText节点是标准的树节点,只显示文本...
网站作为一种信息载体,具有存储容量大、表现形式多样、资源共享和实时交互的特点,为教育提供了无限可能。目前,虽然有些学校已经尝试将网络应用于教学,但多数仍局限于多媒体教学软件。真正的专题学习网站能够提供...
- UP是一种流行的面向对象系统的迭代式软件开发过程。 - **阶段划分**: - **初始阶段**: 构想、业务案例、范围、模糊评估。 - **细化阶段**: 已精炼的构想、核心架构的迭代实现、高风险解决、需求和范围确定。 - ...
云计算是一种通过互联网提供按需计算服务的模式,包括服务器、存储、数据库、网络、软件、分析能力等,用户无需直接管理和维护底层基础设施,而是以订阅或付费使用的方式获取服务。这种模式大大降低了企业和个人使用...
总结来说,AR和VR分别代表了增强现实和虚拟现实,它们在技术实现和应用场景上有所区别,而BD则是一种高容量的光学存储技术,为高清内容的分发提供了可能。这三者共同推动了数字媒体和互动体验的创新与发展。
10. 基于夹角变化趋势判断多边形搜索方向的算法:梁晓文等人提出了一种新的算法,该算法基于夹角变化趋势来判断多边形的搜索方向,这为多边形搜索算法提供了新的思路。 11. 数据结构、数据分析、大数据:文章标题中...
2. 云计算的概念、特点和三层架构:云计算是一种基于网络,按需提供可调节的计算资源、存储资源和网络资源的网络架构。其特点包括降低成本、提高资源利用效率和灵活性。云计算的三层架构通常包括基础设施层、平台层...
7. 服务器:服务器是一种专为多用户服务的计算机,它们通常具有更高的性能和稳定性,用于提供网络服务。 8. 嵌入式计算机:这些计算机被嵌入到各种设备中,如冰箱中的微电脑,它们通常是专用的,不能随意修改程序。...
总的来说,voicesrepo是一个致力于改进传统语音邮件体验的Objective-C项目,它通过创新设计和重构技术,为用户提供了一种全新的、现代的沟通方式。如果你对iOS或macOS开发感兴趣,或者对重构有深入研究,这个项目会...
"shp"是Esri公司开发的Shapefile格式,是一种常见的矢量地理数据格式,用于存储地理坐标和相关的属性信息。"矢量"则表示数据是基于几何对象(如点、线、多边形)的形式,可以精确地表示地理位置和形状。 【知识详解...
Swift是一种新的编程语言,用于iOS和OS X的应用程序,建立在 最佳的C和Objective-C中,没有C的兼容性的限制。迅速 采用安全的编程模式,并增加了现代的功能,使 编程更简单,更灵活,更有趣。斯威夫特的洗涮,通过...
"重新构想"表明该方案可能是对现有项目管理流程的一种创新性改造,可能涉及到软件设计、开发效率、协作方式或者任务跟踪等方面的重大改进。 【标签】"java project-management address-book todo-list ...
**部署模型(Deployment Model)**是UML中描述系统硬件和软件组件如何在物理环境中配置的一种视图。它涵盖了系统运行时的物理拓扑,包括服务器、客户端、网络设备等,以及它们之间的通信关系。在描述分布时,该模型...
编程是一种创造性的活动,它能够帮助我们实现心中的构想。在本篇内容中,我们将一起探索Java这一强大语言的基础概念——变量、数据类型与运算符。 #### 第一章节:变量——你的魔法储物柜 **变量**是程序设计中的...
资料模型一种半结构化NoSQL样式数据模型( ),该模型是通过使用对象数据库构想扩展JSON而产生的 查询语言两种表达性和声明性查询语言( 和 )支持对半结构化数据的广泛查询和分析 可扩展性并行运行时查询执行引擎...
1. 电子商务的核心问题是“数据信息”,知识产权法律制度是保护信息的一种法律工具。 2. 电子商务为知识产权的获得提供了一种新的途径。在电子商务的影响下,一种新的获得知识产权的途径——电子申请也已问世。 二...