八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  240 随笔 :: 0 文章 :: 3330 评论 :: 14 引用

缺省条件下,EMF不会为每个对象维护一个唯一的id,这在一些情况下不太方便,例如要在web环境下编辑一个EMF模型实例,通常需要在URL里传递对象的id以便确定目标。

有两种方式解决这类问题。第一种是在模型里给每个对象增加一个id属性,并维护使其保持唯一,例如在XXXFactory的createXXX()方法里为这个属性赋值。另一种方式是借助EMF的功能。其实EMF的XMIResource维护了一个id与对象的映射表,并且会为每个新创建的对象自动赋值,只要稍微设置一下就可以启用这个功能,具体的方法如下。

1. 在xxx.genmodel里选中package节点,在属性视图里把Resource Type属性的值设置为XMI。

 

2. 重新生成代码,EMF生成的代码里会比原来多出XXXResourceImpl.java文件。

3. 在XXXResourceImpl.java里,覆盖useUUIDs()方法,让其返回true(缺省返回的是false)。

4. 重新生成代码。(删除以前的Manifest.MF和plugin.xml文件以便这两个文件能得到更新)

这样,如果用文本方式查看新创建的模型实例文件,会发现每个对象都多出一个xmi:id属性,如xmi:id="_gitpslkoEd2PdI7FPnuunA"。要在程序里使用这个id,只需要用resource.getId(eobject)即可得到,其中resource可以通过eobject.eResource()很方便的获得。

参考链接:
How To Enable UUID In EMF Generated Model To Get Copy&Paste Working(这个链接里的方法太麻烦了,但功效一样。)
Eclipse GMF - Enabling UUIDs in Semantic model - The Simplest Way(用GMF的时候这个链接里的方法应该比较方便)

posted on 2008-07-24 21:32 八进制 阅读(4484) 评论(2) 编辑 收藏

评论

#1楼 2009-07-30 10:22 yomi[未注册用户]
请问EMF保存后所有属性都是小写,但schema需要大写
比如id=""应该是Id=""
这个是在emf或gmf程序的哪块控制的么?
 回复 引用   

#2楼[楼主] 2009-07-31 15:07 八进制      
@yomi
用ExtendedMetaData应该可以实现,大体步骤如下:

1、在保存模型的代码处,先创建一个ExtendedMetaData实例:
final ExtendedMetaData ext = new BasicExtendedMetaData(ExtendedMetaData.ANNOTATION_URI,EPackage.Registry.INSTANCE, new HashMap());

2、把需要改的类或属性的名字设置其中:
ext.setName(MyPackage.Literals.MY_STRUCTURAL_FEATURE, "myDesiredName");//e.g. id->Id

3、把这个ExtendedMetaData实例作为持久化选项交给resource:
Map options = new HashMap();
options.put(XMLResource.OPTION_EXTENDED_META_DATA, ext);
resource.save(options);

详细请参考EMF book第二版,15.3.5节。
 回复 引用 查看