现在,我们一般都用关系数据库存储对象,用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而产生的 查询语言两种表达性和声明性查询语言( 和 )支持对半结构化数据的广泛查询和分析 可扩展性并行运行时查询执行引擎...