方案征集, 打算移植hibernate到delphi或.net (50分)

  • 主题发起人 主题发起人 yyanghhong
  • 开始时间 开始时间
Y

yyanghhong

Unregistered / Unconfirmed
GUEST, unregistred user!
hibernate是java的一个很好的OR mapping框架, http://hibernate.bluemars.net/
在对他研究后, 提出了几个移植hibernate的关键技术问题

1. 动态生成class和interface.
OR Mapping需要实现persistence和domain层, hibernate用persistence object (PO)来实现persistence, java old plain object(JOPO) 来实现domain, JOPO因为需要包含business logic, 得由programmer来手写. PO给JOPO提供一个数据库存储代理, 它对programmer来说是透明的. hibernate根据XML格式的HBM配置文件在运行期动态生成PO. 生成的手段是用CGLib(Code Generation Library), 一个java的开源库. http://cglib.sourceforge.net/

2. 提供一个类似Sql, 但支持面向对象特性(inheritence, polymorphism and association)的OR mapping查询语言HQL.
OR Mapping工具需要提供给programmer一种这样的语言, 比如EJB用EJBQL, 他会带来两方面的好处, 一是数据库无关, 用HQL查询, 用户不用考虑不同数据库查询SQL的差异, ibernate提供很多不同的数据库方言类, 他会用数据库方言把HQL翻译成不同的数据库查询SQL. 这样程序数据库移植时只要更改数据库方言配置就可以了.
二是当hibernate从数据库得到数据后, 可很容易把HQL中的反映的对象间关系抽取出来.. 根据关系把数据放到不同的PO中.

3. 事务支持,
hibernate同时支持本地事务和分布式事务. 对本地事务, 他是用JDBC的事务机制来解决的, programmer需要在代码中控制, 对分布式事务, 他是用JTA来解决.这象com+事务处理, 需要容器的支持.
另外hibernate对长事务还提供了versioning 和Optimistic Locking的手段, 这也是EJB design pattern的标准模式

4. 线程同步处理
hibernate提供了session factory和session来解决这个问题, session factory是一个线程安全但开销大的对象, 它可被多个线程同时访问, session是线程不安全但开销小的对象, 只可被一个线程访问. 这样hibernate把需要线程共享的东西放在session factory,不需共享的放在session中.


对上面hibernate的简单介绍可看出, 个人认为移植的难点是CGLib和HQL在delphi或.net的实现上, 希望大家给提供好意见, 另外由于对hibernate的了解不足, 介绍不对的地方或其他重要特性还望指出

 
刚看到 hibernate,虽然不知好不好,不过也有将其移植到Delphi 的想法。。。
只是本人水平一般,所以只是一个想法。。。。。
 
UP..............
 
对于第一条,动态生成Class 和 Interface,我想不出什么来,不过,我觉得

Delphi 中的 SOAP会提供一个方法,因为Delphi 需要根据SOAP包来生成对应的Class和

Interface。。。。好在SOAP有源码,可以看看是怎么样做的。。。
 
soap 可根据web service的WSDL生成接口代码, 类代码还需自己写, 你说的根据soap包生成的是对象, 不是类, 这类似ole的late binding.可用一个根据类名生成对象, 用Variant保存对象接口的reference.
var
MSWord: Variant;
begin
MSWord := CreateOleObject('Word.Basic');
end;
.net里有一些办法, delphi 8的RTTI功能也会增强. 我先写了一个HQL parser, 帮忙测试一下
http://hibernate.fankai.com/viewtopic.php?t=507

 
后退
顶部