>>sessionBean --> DAO(JDBC+SQL) 业务逻辑与数据库偶合太密。不利于扩展及维护。
用ORM的原因主要不是因为降低耦合。使用JDBC并不会造成和数据库过分的耦合,除非你总是用数据库扩展的SQL,而不是ANSI SQL92。当然ORM和数据库的耦合度更低。
自己使用JDBC来实现ORM绝不是blues说的那么容易的,要处理大量很棘手的问题,否则ORM就没有存在的必要了。简单的来说,一个复合持久对象你用JDBC实现ORM就非常麻烦,主要的困难不在于多表查询,在于你怎么实现动态的lazy loading?我相信blues没有用JDBC做过复杂的ORM工作,否则就不会这样想当然了。我在没有听说过ORM之前就是自己手工写JDBC代码来实现ORM的,一旦持久对象之间存在复杂的组合和聚合关系,很难按照OO设计做下去了。我曾经为此头疼过很久,一直没有好的解决办法,直到接触JDO和Hibernate,才算找到答案。
>>但我现在还不知道如果数据库端若有变化,如何将变化自动或半自动的反映到Object这边
http://hibernate.bluemars.net/52.html
ReverseEngTool可以这样做,但还不够好。可以手工修改XML Mapping File,然后用CodeGenerator自动生成代码。
>>在BMT的SessionBean 中,也可以将 JDBC 和 JTA 事务混合在一起。但是这样做容易引起混乱,不利于维护代码
不能混合使用,事务不能嵌套,会报错的。本质上来说,JDBC事务是由数据库管理的,JTA事务是由App Server容器的事务管理器来管理的。JTA可以实现跨数据库连接,跨域的事务控制。
在多个数据库参与事务的情况下,JTA管理方式颇有不同,需要启动2PC。第一阶段通知参与事务的各资源准备提交,如果有资源没有准备好,全体放弃;第二阶段真正提交,并且记录日志。另外JTA除了可以管理数据库资源外,也可以管理其他资源,比如JMS。
>>你的意思是不是这个被映射的Java class,做为一个control的功能,然后由它来指向不同的数据库表。
对。Hibernate里面提供了一个接口ClassPersister,其抽象了persistent class和数据库对象的映射操作。同时Hibernate也提供了两个
ClassPersister接口的具体实现类:
EntityPersister:根据Mapping 文件中定义的对象属性和表字段映射关系,处理"table-per-class-hierarchy" mapping
NormalizedEntityPersister:根据Mapping 文件中定义的对象属性和表字段映射关系,处理"table-per-subclass" mapping
默认情况下,Hibernate就是调用EntityPersister和NormalizedEntityPersister 来处理对象和表映射的。但如果EntityPersister和NormalizedEntityPersister都不能满足你的要求的话,就可以自己写一个ClassPersister的实现类,处理更复杂多变的动态映射关系。
最后在XML Mapping文件里面指定使用你自己写的ClassPersister实现类,而不使用默认的EntityPersister。由此也可以看出Hibernate本身具有很强的可扩展性,如果Hibernate功能不能满足你的需要,还可以自己扩充Hibernate的功能。相关介绍和例子见Hibernate文档第4.1.3节:
http://hibernate.bluemars.net/hib_docs/reference/html/or-mapping.htmlor-mapping-s1-3