`
Kensai
  • 浏览: 16512 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
saw
文章分类
社区版块
存档分类
最新评论

2010 Java持久化之旅 --起源

阅读更多
   在广大人民群众和资深玩家的建议下,我开始认真得不得再认真的学习Java持久层的技术。目前关于持久层的书太多,高手建议下,貌似开发hibernate 作者写的Persistence with hibernate 比较靠谱,so ,学习开始。先把这周的学习内容总结下。
1.起源
任何事情产生,都有原因。Hibernate或者其他持久层的框架iBATIS之类我一直认为是因为很多人不会写SQL或者说写不好SQL。But,看了P书Part1后,偶知道,偶错了。
SQL诞生
首先,从持久化说起。持久化,就是把Aplication的状态或者部分状态,保存到可以断电之后依然存在的设备中(比如说,纸上。。。)。
而所有这些东西中,平板文件,XML或者。。。纸,都不是很靠谱,也不好管理,不好阅读。所以,这是为什么数据库产生的原因。

持久化来了
继续来说持久化,把数据(Application中的状态)存入数据库中,然后在一定时间取出来,持久化大概就这样。
具体来说,持久化需要做到以下几点才能叫做真正的成功:
a.能够保存,组织数据,并且可以把数据以一定结构读出
b.处理并发,和保证数据完整性(如果存银行的时候是5000,取出来的时候是5块,那么久没必要存银行了)
c.处理数据共享

问题也来了
我看到这里的时候也很奇怪,为啥米会有问题,把对象的属性保存到数据库不久完事了吗?
但是,因为OO的出现,本来过程化编程中的结构体和数据库表之间几乎相等的映射关系被打破了。

a.Application模型粒度与数据库模型粒度不匹配
   假设有个User中有一些基本属性,又有一个名为Bill的对象引用。类像这样
User{
//some popers
String name;
Bill bill;
//methods
}
Bill{
//bill propers
}
数据库表
create table USER{
NAME varchar(10);
//the following propers represents bill information
MONEY int;
LAST_DATE int;
}
在Application中,有2层User,Bill (用DDD来说就是2个实体对象模型) 但在数据库这一层,我们只看到了一个表。
当时看到这里的时候,我就在想,作者傻呀,我再建一个BILL表不久完了。对,但这回引来另外一个模型不匹配。

b.关系映射不匹配
就像上面例子,如果我们多见一个表BILL.
首先需要明白的是:OO映射使用的是Reference,但数据库映射使用的是外键。这之间的区别会导致一些现在还没看到的问题:
我们先稍微修改下上面的两个类
User{
//some popers
String name;
Set<Bill> bills;
//methods
}
Bill{
Set<User> usersToPayTheBill;
//bill propers
}
简单的一一对应,变成了多对多。现在的问题是,如何能让数据库表现出这种关系呢?对,中间表。
这张中间表,USER_BILL可以使用User和Bill的主键做外键。问题搞定了。。。。吗?
我并没有在Application模型中看到哪里有USER_BILL表可以对应过去的地方。这也实际上是问题a,粒度匹配不上导致的。

c.问题还在继续,OO中的继承关系如何表示
还是拿代码说事,现在User和Bill都在和谐世界中改进了下,开始使用面向接口编程了。。。
User{
//some popers
String name;
Bill bill;
//methods
}
abstract Bill{
long defaultBill = 1000;
//bill propers
}
BillForDuty extends Bill{
//BillForDuty propers
}
BillForRent extends Bill{
//BillForRent propers
}
其他不用说,直接傻眼。对象模型中的继承是叫做Type Inheritance,但关系数据库中的对应类的Table不是一个类型,不存在SuperTable和SubTable之说。
问题还没有结束,面向对象中继承封装和多态,才说了一个不匹配。
当我把一个BillForDuty 得实力丢给User时,只有运行时才会知道这个Bill 引用背后就是个BillForDuty 而不是其他的Bill类型。如果我想根据对象去查询相关信息,我只有寄希望SQL可以做到,但是由于前面说过关系数据库维护关系是通过外键,而外键是直接把值绑定到具体的表上,所以挂了。

d.Equivalent不匹配
就是说对象的equals()或者 == 法在数据库这一层体现说来。因为不管是equals()还是 == ,都是针对对象模型,关系数据库的等同性是由主键决定。

e.查找不匹配
对象模型中要查找一个具体的值 比如 someObject.getProperA().getProperB() 就ok了。但是在关系数据库中要这样写
select * from Object o left outer join A a on a.B_id = o.O_id where o.A=123
好像没问题,但是问题就是:在对象模型中,你不知道getProperA()拿出来是什么就可以继续拿A中B的值,但是在关系数据库中尼必须先知道A是123才能继续找。
*这里有个问题。。。不是PreparedStatement就可以解决者问题吗?

模型不匹配的代价
最大的体会就是,要扭曲领域模型去匹配更难搞定的数据库模型。
今天到此为止,明后争取天把第二部分的总结弄好。






分享到:
评论
8 楼 linliangyi2007 2010-03-09  
Kensai 写道
   在广大人民群众和资深玩家的建议下,我开始认真得不得再认真的学习Java持久层的技术。目前关于持久层的书太多,高手建议下,貌似开发hibernate 作者写的Persistence with hibernate 比较靠谱,so ,学习开始。先把这周的学习内容总结下。
1.起源
任何事情产生,都有原因。Hibernate或者其他持久层的框架iBATIS之类我一直认为是因为很多人不会写SQL或者说写不好SQL。But,看了P书Part1后,偶知道,偶错了。
SQL诞生
首先,从持久化说起。持久化,就是把Aplication的状态或者部分状态,保存到可以断电之后依然存在的设备中(比如说,纸上。。。)。
而所有这些东西中,平板文件,XML或者。。。纸,都不是很靠谱,也不好管理,不好阅读。所以,这是为什么数据库产生的原因。

持久化来了
继续来说持久化,把数据(Application中的状态)存入数据库中,然后在一定时间取出来,持久化大概就这样。
具体来说,持久化需要做到以下几点才能叫做真正的成功:
a.能够保存,组织数据,并且可以把数据以一定结构读出
b.处理并发,和保证数据完整性(如果存银行的时候是5000,取出来的时候是5块,那么久没必要存银行了)
c.处理数据共享

问题也来了
我看到这里的时候也很奇怪,为啥米会有问题,把对象的属性保存到数据库不久完事了吗?
但是,因为OO的出现,本来过程化编程中的结构体和数据库表之间几乎相等的映射关系被打破了。

a.Application模型粒度与数据库模型粒度不匹配
   假设有个User中有一些基本属性,又有一个名为Bill的对象引用。类像这样
User{
//some popers
String name;
Bill bill;
//methods
}
Bill{
//bill propers
}
数据库表
create table USER{
NAME varchar(10);
//the following propers represents bill information
MONEY int;
LAST_DATE int;
}
在Application中,有2层User,Bill (用DDD来说就是2个实体对象模型) 但在数据库这一层,我们只看到了一个表。
当时看到这里的时候,我就在想,作者傻呀,我再建一个BILL表不久完了。对,但这回引来另外一个模型不匹配。

b.关系映射不匹配
就像上面例子,如果我们多见一个表BILL.
首先需要明白的是:OO映射使用的是Reference,但数据库映射使用的是外键。这之间的区别会导致一些现在还没看到的问题:
我们先稍微修改下上面的两个类
User{
//some popers
String name;
Set<Bill> bills;
//methods
}
Bill{
Set<User> usersToPayTheBill;
//bill propers
}
简单的一一对应,变成了多对多。现在的问题是,如何能让数据库表现出这种关系呢?对,中间表。
这张中间表,USER_BILL可以使用User和Bill的主键做外键。问题搞定了。。。。吗?
我并没有在Application模型中看到哪里有USER_BILL表可以对应过去的地方。这也实际上是问题a,粒度匹配不上导致的。

c.问题还在继续,OO中的继承关系如何表示
还是拿代码说事,现在User和Bill都在和谐世界中改进了下,开始使用面向接口编程了。。。
User{
//some popers
String name;
Bill bill;
//methods
}
abstract Bill{
long defaultBill = 1000;
//bill propers
}
BillForDuty extends Bill{
//BillForDuty propers
}
BillForRent extends Bill{
//BillForRent propers
}
其他不用说,直接傻眼。对象模型中的继承是叫做Type Inheritance,但关系数据库中的对应类的Table不是一个类型,不存在SuperTable和SubTable之说。
问题还没有结束,面向对象中继承封装和多态,才说了一个不匹配。
当我把一个BillForDuty 得实力丢给User时,只有运行时才会知道这个Bill 引用背后就是个BillForDuty 而不是其他的Bill类型。如果我想根据对象去查询相关信息,我只有寄希望SQL可以做到,但是由于前面说过关系数据库维护关系是通过外键,而外键是直接把值绑定到具体的表上,所以挂了。

d.Equivalent不匹配
就是说对象的equals()或者 == 法在数据库这一层体现说来。因为不管是equals()还是 == ,都是针对对象模型,关系数据库的等同性是由主键决定。

e.查找不匹配
对象模型中要查找一个具体的值 比如 someObject.getProperA().getProperB() 就ok了。但是在关系数据库中要这样写
select * from Object o left outer join A a on a.B_id = o.O_id where o.A=123
好像没问题,但是问题就是:在对象模型中,你不知道getProperA()拿出来是什么就可以继续拿A中B的值,但是在关系数据库中尼必须先知道A是123才能继续找。
*这里有个问题。。。不是PreparedStatement就可以解决者问题吗?

模型不匹配的代价
最大的体会就是,要扭曲领域模型去匹配更难搞定的数据库模型。
今天到此为止,明后争取天把第二部分的总结弄好。









楼主,给你一个中肯的批评。
之所以你感到是用ORM这么吃力,或者说模型上很扭曲,究其根本是,你在使用“面向数据的思维”做设计,却又利用“面向对象的工具”来实现你的设计,再说的直白一些,你没有掌握从OOD--OOP的过程,这个是无数写SQL的大拿都长犯得“弊病”,主要是思维习惯了。

没有贬义的意思,就是提醒楼主,从改变思维方式的角度出发,尝试是用PD中的OOM来设计吧,而不要从CDM入手了。
7 楼 DoubleEO 2010-03-09  
好像hibernate quickily里面也提到过这些东西
6 楼 linkerlin 2010-03-08  
总结的不错.
语言稍微再组织下就更好了.
5 楼 alswl 2010-03-08  
扭曲领域模型去匹配更难搞定的数据库模型

这句话道出了ORM的所为
4 楼 zhanghaocool 2010-03-08  
买的孙卫琴的hibernate,刚看前几章感觉还行,后面还没看。

收藏了,看看你笔记。
3 楼 yvfish 2010-03-08  
传说:持久化ORM的出现是数学领域与工程领域的纠结。。。
2 楼 form_rr 2010-03-08  
看了LZ的话,才发现原来还是有很多人在关心
关系型数据库储存程序对象的问题哈!
1 楼 gzd03 2010-03-08  
学习了,同样是初学,LZ比我理解的深刻,我该努力了

相关推荐

    spring开发指南

    - **环境搭建**:为了开始Spring开发之旅,首先需要搭建好开发环境。这通常包括安装Java开发工具包(JDK)、集成开发环境(IDE,如IntelliJ IDEA或Eclipse)、以及配置Maven或Gradle等构建工具。 - **构建Spring基础代码...

    JBPM4工作流应用开始指南.rar

    282 16.2 电子邮件服务器 285 16.3 电子邮件扩展 287 16.4 小结 289 第17章 系统日志 290 17.1 配置日志 290 17.2 日志输出级别 292 17.3 Java Logging API日志 292 17.4 利用持久化层日志进行调试 294 17.5 小结 ...

    SNS单模无芯光纤仿真与传感器结构特性分析——基于Rsoft beamprop模块

    内容概要:本文主要探讨了SNS单模无芯光纤的仿真分析及其在通信和传感领域的应用潜力。首先介绍了模间干涉仿真的重要性,利用Rsoft beamprop模块模拟不同模式光在光纤中的传播情况,进而分析光纤的传输性能和模式特性。接着讨论了光纤传输特性的仿真,包括损耗、色散和模式耦合等参数的评估。随后,文章分析了光纤的结构特性,如折射率分布、包层和纤芯直径对性能的影响,并探讨了镀膜技术对光纤性能的提升作用。最后,进行了变形仿真分析,研究外部因素导致的光纤变形对其性能的影响。通过这些分析,为优化光纤设计提供了理论依据。 适合人群:从事光纤通信、光学工程及相关领域的研究人员和技术人员。 使用场景及目标:适用于需要深入了解SNS单模无芯光纤特性和优化设计的研究项目,旨在提高光纤性能并拓展其应用场景。 其他说明:本文不仅提供了详细的仿真方法和技术细节,还对未来的发展方向进行了展望,强调了SNS单模无芯光纤在未来通信和传感领域的重要地位。

    发那科USM通讯程序socket-rece

    发那科USM通讯程序socket-set

    嵌入式八股文面试题库资料知识宝典-WIFI.zip

    嵌入式八股文面试题库资料知识宝典-WIFI.zip

    JS+HTML源码与image

    源码与image

    物流行业车辆路径优化:基于遗传算法和其他优化算法的MATLAB实现及应用

    内容概要:本文详细探讨了物流行业中路径规划与车辆路径优化(VRP)的问题,特别是针对冷链物流、带时间窗的车辆路径优化(VRPTW)、考虑充电桩的车辆路径优化(EVRP)以及多配送中心情况下的路径优化。文中不仅介绍了遗传算法、蚁群算法、粒子群算法等多种优化算法的理论背景,还提供了完整的MATLAB代码及注释,帮助读者理解这些算法的具体实现。此外,文章还讨论了如何通过MATLAB处理大量数据和复杂计算,以得出最优的路径方案。 适合人群:从事物流行业的研究人员和技术人员,尤其是对路径优化感兴趣的开发者和工程师。 使用场景及目标:适用于需要优化车辆路径的企业和个人,旨在提高配送效率、降低成本、确保按时交付货物。通过学习本文提供的算法和代码,读者可以在实际工作中应用这些优化方法,提升物流系统的性能。 其他说明:为了更好地理解和应用这些算法,建议读者参考相关文献和教程进行深入学习。同时,实际应用中还需根据具体情况进行参数调整和优化。

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    基于灰狼优化算法的城市路径规划Matlab实现——解决TSP问题

    内容概要:本文介绍了基于灰狼优化算法(GWO)的城市路径规划优化问题(TSP),并通过Matlab实现了该算法。文章详细解释了GWO算法的工作原理,包括寻找猎物、围捕猎物和攻击猎物三个阶段,并提供了具体的代码示例。通过不断迭代优化路径,最终得到最优的城市路径规划方案。与传统TSP求解方法相比,GWO算法具有更好的全局搜索能力和较快的收敛速度,适用于复杂的城市环境。尽管如此,算法在面对大量城市节点时仍面临运算时间和参数设置的挑战。 适合人群:对路径规划、优化算法感兴趣的科研人员、学生以及从事交通规划的专业人士。 使用场景及目标:①研究和开发高效的路径规划算法;②优化城市交通系统,提升出行效率;③探索人工智能在交通领域的应用。 其他说明:文中提到的代码可以作为学习和研究的基础,但实际应用中需要根据具体情况调整算法参数和优化策略。

    嵌入式八股文面试题库资料知识宝典-Intel3.zip

    嵌入式八股文面试题库资料知识宝典-Intel3.zip

    嵌入式八股文面试题库资料知识宝典-2019京东C++.zip

    嵌入式八股文面试题库资料知识宝典-2019京东C++.zip

    嵌入式八股文面试题库资料知识宝典-北京光桥科技有限公司面试题.zip

    嵌入式八股文面试题库资料知识宝典-北京光桥科技有限公司面试题.zip

    物理学领域十字形声子晶体的能带与传输特性研究及应用

    内容概要:本文详细探讨了十字形声子晶体的能带结构和传输特性。首先介绍了声子晶体作为新型周期性结构在物理学和工程学中的重要地位,特别是十字形声子晶体的独特结构特点。接着从散射体的形状、大小、排列周期等方面分析了其对能带结构的影响,并通过理论计算和仿真获得了能带图。随后讨论了十字形声子晶体的传输特性,即它对声波的调控能力,包括传播速度、模式和能量分布的变化。最后通过大量实验和仿真验证了理论分析的正确性,并得出结论指出散射体的材料、形状和排列方式对其性能有重大影响。 适合人群:从事物理学、材料科学、声学等相关领域的研究人员和技术人员。 使用场景及目标:适用于希望深入了解声子晶体尤其是十字形声子晶体能带与传输特性的科研工作者,旨在为相关领域的创新和发展提供理论支持和技术指导。 其他说明:文中还对未来的研究方向进行了展望,强调了声子晶体在未来多个领域的潜在应用价值。

    嵌入式系统开发_USB主机控制器_Arduino兼容开源硬件_基于Mega32U4和MAX3421E芯片的USB设备扩展开发板_支持多种USB外设接入与控制的通用型嵌入式开发平台_.zip

    嵌入式系统开发_USB主机控制器_Arduino兼容开源硬件_基于Mega32U4和MAX3421E芯片的USB设备扩展开发板_支持多种USB外设接入与控制的通用型嵌入式开发平台_

    e2b8a-main.zip

    e2b8a-main.zip

    少儿编程scratch项目源代码文件案例素材-火柴人跑酷(2).zip

    少儿编程scratch项目源代码文件案例素材-火柴人跑酷(2).zip

    【HarmonyOS分布式技术】远程启动子系统详解:跨设备无缝启动与智能协同的应用场景及未来展望

    内容概要:本文详细介绍了HarmonyOS分布式远程启动子系统,该系统作为HarmonyOS的重要组成部分,旨在打破设备间的界限,实现跨设备无缝启动、智能设备选择和数据同步与连续性等功能。通过分布式软总线和分布式数据管理技术,它能够快速、稳定地实现设备间的通信和数据同步,为用户提供便捷的操作体验。文章还探讨了该系统在智能家居、智能办公和教育等领域的应用场景,展示了其在提升效率和用户体验方面的巨大潜力。最后,文章展望了该系统的未来发展,强调其在技术优化和应用场景拓展上的无限可能性。 适合人群:对HarmonyOS及其分布式技术感兴趣的用户、开发者和行业从业者。 使用场景及目标:①理解HarmonyOS分布式远程启动子系统的工作原理和技术细节;②探索该系统在智能家居、智能办公和教育等领域的具体应用场景;③了解该系统为开发者提供的开发优势和实践要点。 其他说明:本文不仅介绍了HarmonyOS分布式远程启动子系统的核心技术和应用场景,还展望了其未来的发展方向。通过阅读本文,用户可以全面了解该系统如何通过技术创新提升设备间的协同能力和用户体验,为智能生活带来新的变革。

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_1.zip

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_1.zip

    少儿编程scratch项目源代码文件案例素材-激光反弹.zip

    少儿编程scratch项目源代码文件案例素材-激光反弹.zip

    COMSOL相控阵检测技术在有机玻璃斜楔中检测工件内部缺陷的应用研究

    内容概要:本文详细介绍了COMSOL相控阵检测技术在有机玻璃斜楔上放置16阵元进行工件内部缺陷检测的方法。首先阐述了相控阵检测技术的基本原理,特别是通过控制各阵元的激发时间和相位来实现声波的聚焦和扫描。接着,重点解析了横孔缺陷的反射接收波,解释了波的折射现象及其背后的物理原因。最后,通过实例展示了COMSOL模拟声波传播过程的成功应用,验证了该技术的有效性和准确性。 适合人群:从事固体力学、无损检测领域的研究人员和技术人员,尤其是对相控阵检测技术和COMSOL仿真感兴趣的读者。 使用场景及目标:适用于需要精确检测工件内部缺陷的研究和工业应用场景,旨在提高检测精度和效率,确保产品质量和安全。 其他说明:文中提到的声速匹配现象有助于理解波在不同介质间的传播特性,这对优化检测参数设置有重要意义。

Global site tag (gtag.js) - Google Analytics