|
该帖已经被评为精华帖
|
|
|---|---|
| 作者 | 正文 |
|
时间:2005-07-09
http://www.almaer.com/blog/archives/000993.html
引用 I am getting to play with Hibernate 3, and they have done a nice job. I was poking around the Caveat Emptor example from Hibernate in Action, which was updated for Hibernate3.
I happened across this file: package-info.java: [code:1]@TypeDefs({ @TypeDef( name="monetary_amount_usd", typeClass = MonetaryAmountType.class, parameters = { @Parameter(name="convertTo", value="USD") } ), @TypeDef( name="monetary_amount_eur", typeClass = MonetaryAmountType.class, parameters = { @Parameter(name="convertTo", value="EUR") } ), @TypeDef( name="item_state", typeClass = EnumUserType.class, parameters = { @Parameter(name="enumClassName", value="org.hibernate.ce.auction.model.ItemState") } ), @TypeDef( name="creditcard_type", typeClass = EnumUserType.class, parameters = { @Parameter(name="enumClassName", value="org.hibernate.ce.auction.model.CreditCardType") } ), @TypeDef( name="rating", typeClass = EnumUserType.class, parameters = { @Parameter(name="enumClassName", value="org.hibernate.ce.auction.model.Rating") } ) }) @NamedQueries({ @NamedQuery( name="minBid", queryString="select b from Bid b where b.amount.value = (select min(b.amount.value) from Bid b where b.item.id = :itemid)" ), @NamedQuery( name="maxBid", queryString="select b from Bid b where b.amount.value = (select max(b.amount.value) from Bid b where b.item.id = :itemid)" ) }) package org.hibernate.ce.auction.persistence; import org.hibernate.annotations.*; import javax.persistence.*;[/code:1] Is this better than XML? To have this code sucked in? NOTE: You don't have to use the annotations of course. 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2005-07-09
从提高效率、更方便的角度来看:
xDoclet、Annotation、XML都一样,一样的无能。 我觉的唯一可以依赖的就是GUI工具。当然,GUI工具可以基于XML和Annotation开发。 Annotation作为MetaData,算是稍胜其它方法的地方吧。 在没有GUI工具情况下,也不考虑动态使用Annotation,个人还是喜欢使用Annotation而不是XML,就是因为懒得一会java一会xml的。 |
|
| 返回顶楼 | |
|
时间:2005-07-09
一直比较反感annotation,把Java代码弄得不像代码的样子,看起来就不爽。
|
|
| 返回顶楼 | |
|
时间:2005-07-09
TomHornson 写道 从提高效率、更方便的角度来看:
xDoclet、Annotation、XML都一样,一样的无能。 我觉的唯一可以依赖的就是GUI工具。当然,GUI工具可以基于XML和Annotation开发。 Annotation作为MetaData,算是稍胜其它方法的地方吧。 在没有GUI工具情况下,也不考虑动态使用Annotation,个人还是喜欢使用Annotation而不是XML,就是因为懒得一会java一会xml的。 然则就算有了好的visual IDE,还是得把metadata保存在某个地方亚。总不能保存在IDE自己的数据库里面吧。 |
|
| 返回顶楼 | |
|
时间:2005-07-09
robbin 写道 一直比较反感annotation,把Java代码弄得不像代码的样子,看起来就不爽。
关键是耦合太深。就拿hibernate来说吧,若是用XML,数据库改个字段名,服务器这边只需要改XML文件;若是用annotation,就得改source code,然后recompile。关键是在server上要改东西很可能压根找不到source code,或者找到也不一定有环境编译,这就比较恶心了。 |
|
| 返回顶楼 | |
|
时间:2005-07-09
gigix 写道 TomHornson 写道 从提高效率、更方便的角度来看:
xDoclet、Annotation、XML都一样,一样的无能。 我觉的唯一可以依赖的就是GUI工具。当然,GUI工具可以基于XML和Annotation开发。 Annotation作为MetaData,算是稍胜其它方法的地方吧。 在没有GUI工具情况下,也不考虑动态使用Annotation,个人还是喜欢使用Annotation而不是XML,就是因为懒得一会java一会xml的。 然则就算有了好的visual IDE,还是得把metadata保存在某个地方亚。总不能保存在IDE自己的数据库里面吧。 annotation还是放在source中,不过,不要手动来写。完全通过GUI工具来维护。 GUI工具在source中插入Annotation或者分析已有的Annotation通过GUI显示,等等。 前端时间,我向我们组负责开发Tools的人员提过这种思路,当然,这个Tools也支持维护XML配置格式。 |
|
| 返回顶楼 | |
|
时间:2005-07-09
gigix 写道 robbin 写道 一直比较反感annotation,把Java代码弄得不像代码的样子,看起来就不爽。
关键是耦合太深。就拿hibernate来说吧,若是用XML,数据库改个字段名,服务器这边只需要改XML文件;若是用annotation,就得改source code,然后recompile。关键是在server上要改东西很可能压根找不到source code,或者找到也不一定有环境编译,这就比较恶心了。 这个的确。 |
|
| 返回顶楼 | |
|
时间:2005-07-09
我是感觉,在java中,annotation的出现比较无奈的说,java语言的动态能力比C++好很多,但仍然是静态类型语言,而OO的设计,强调的就是类型可变带来的灵活性(由于算法已经融合到类型里了),这里的矛盾在java中是利用动态加载类,反射及动态代理通过在运行时读取配置信息加载正确的类型来解决。——说白了,就是把类型信息变成用string来描述,然后到配置文件里查找相应的类型信息,进行动态加载。
OK,这样带来的问题就是,配置已经变成另一种形式的代码了,在编译器之外存在的代码。这样的话无异于让一份代码散布于不同的环境,应用稍大的话,会给开发,测试和维护都带来麻烦。 annotation的出现,就是将这部分从新纳入统一的管理,以一种标准的形式。 另外,gigix举的例子不妥,很少有改动是只改改配置文件就能解决的,数据库要是要改的话,基本是一路改到前台的了。用annotation也不是就完全不用配置文件了。使用annotation可以把配置文件变得干净些。 问题没有消失,只是挪个地方解决而已,呵呵 我也不喜欢annotation:( ,如果要用,如TomHornson所说,应该由IDE支持,还好这并不难。象这种MetaData标签,我觉得都应该由IDE来处理。 |
|
| 返回顶楼 | |
|
时间:2005-07-09
annotation是为了解决能够扩展类似于关键字的自定义描述性声明而产生的。
所以并不适合于可以灵活配置的领域。正如关键字public,不会随意变为private,interface也不会变为class一样。 通过annotation可以添加以前增加关键字才能解决的问题,而不用重写编译器。 从这个意义上说,annotation并不适合于作为ORM的映射元数据添加到DomainObject上。另外这种映射的稳定程度要比DomainObject低,也是不适合的另一个原因。 |
|
| 返回顶楼 | |
|
时间:2005-07-11
就我个人而言,annotation既然与代码出现在一起,那么最好是与代码耦合的比较紧,经常改代码就要改
annotation的例子就比较好。比如拿最近火热的ajax说事,如果在某个method前面指明 @ajax.ajaxMethod, 就是很合适的。要比配在xml里头好。 |
|
| 返回顶楼 | |












