添加映射的过程(2) - 解析结点

接着上次的内容,来看看bind中怎么解析<class>

首先,我们来看看Hibernate Mapping DTD 中怎么定义hibernate-mapping与class的关系:

None.gif <! ELEMENT hibernate-mapping (meta*, import*, (class|subclass|joined-subclass)*, query*, sql-query*) >


由此,我们可以得出结论:
1、class,subclass,joined-subclass在结构上应该是并列的。
2、subclass与joined-subclass是有关联的。

在mapping包中,我们可以看出这些关联:
1、class,subclass,joined-subclass有共同的基类 - PersistentClass。这是XML的UML建模的规则之一。
2、class对应的mapping类为RootClass
3、subclass,joined-subclass对应的mapping类都是SubClass,通过isJoinedSubclass()方法作为区别。根据“每一棵类继承树对应一个表”的策略,subclass与其根父类应该映射到同一个表;而joined-subclass则是持久化到一个属于它自己的表,即每一个子类对应一个表的映射策略。

好了,有了上面的知识作为铺垫,我们来看看Binder类中的bindRootClass方法。

bindRootClass方法的功能是解析class结点,它的工作其实很简单,就是解析class结点的属性和它下面的所有子结点:

ExpandedBlockStart.gif ContractedBlock.gif   /**/ /**
InBlock.gif  * 解析class结点
ExpandedBlockEnd.gif  
*/

ExpandedBlockStart.gifContractedBlock.gif 
public   static   void  bindRootClass(Element node, RootClass model, Mappings mappings) throws MappingException  dot.gif {
InBlock.gif
InBlock.gif  
// 处理公共属性
InBlock.gif
  bindClass(node, model, mappings);
InBlock.gif
InBlock.gif  
//TABLENAME
InBlock.gif
  Attribute schemaNode = node.attribute("schema");
InBlock.gif  String schema 
= schemaNode==null ? mappings.getSchemaName() : schemaNode.getValue();
InBlock.gif  Table table 
= mappings.addTable( schema, getClassTableName(model, node, mappings) );
InBlock.gif  model.setTable(table);
InBlock.gif
InBlock.gif  
// 其他属性
InBlock.gif
  dot.gifdot.gif
InBlock.gif
InBlock.gif  
// 处理class下的子结点,做法不好,方法太长太乱。
InBlock.gif
  Iterator subnodes = node.elementIterator();
InBlock.gif  dot.gifdot.gif
InBlock.gif
InBlock.gif  
//Primary key constraint
InBlock.gif  
// 生成主键
InBlock.gif
  model.createPrimaryKey();
InBlock.gif
InBlock.gif  
// 处理子结点
InBlock.gif
  propertiesFromXML(node, model, mappings);
InBlock.gif
ExpandedBlockEnd.gif }

None.gif

 

整个映射的过程中,都是采用这种自顶向下逐步细化的办法来解析各个结点。在第一遍读源码的过程中,了解到此足矣。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值