论坛首页 Java版

[zz]Dion Almaer: Hibernate3 Example of Annotation Hell :)

浏览 11361 次
该帖已经被评为精华帖
作者 正文
时间: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.
   
时间:2005-07-09
从提高效率、更方便的角度来看:
xDoclet、Annotation、XML都一样,一样的无能。
我觉的唯一可以依赖的就是GUI工具。当然,GUI工具可以基于XML和Annotation开发。
Annotation作为MetaData,算是稍胜其它方法的地方吧。

在没有GUI工具情况下,也不考虑动态使用Annotation,个人还是喜欢使用Annotation而不是XML,就是因为懒得一会java一会xml的。
   
0 请登录后投票
时间:2005-07-09
一直比较反感annotation,把Java代码弄得不像代码的样子,看起来就不爽。
   
0 请登录后投票
时间:2005-07-09
TomHornson 写道
从提高效率、更方便的角度来看:
xDoclet、Annotation、XML都一样,一样的无能。
我觉的唯一可以依赖的就是GUI工具。当然,GUI工具可以基于XML和Annotation开发。
Annotation作为MetaData,算是稍胜其它方法的地方吧。

在没有GUI工具情况下,也不考虑动态使用Annotation,个人还是喜欢使用Annotation而不是XML,就是因为懒得一会java一会xml的。


然则就算有了好的visual IDE,还是得把metadata保存在某个地方亚。总不能保存在IDE自己的数据库里面吧。
   
0 请登录后投票
时间:2005-07-09
robbin 写道
一直比较反感annotation,把Java代码弄得不像代码的样子,看起来就不爽。

关键是耦合太深。就拿hibernate来说吧,若是用XML,数据库改个字段名,服务器这边只需要改XML文件;若是用annotation,就得改source code,然后recompile。关键是在server上要改东西很可能压根找不到source code,或者找到也不一定有环境编译,这就比较恶心了。
   
0 请登录后投票
时间: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配置格式。
   
0 请登录后投票
时间:2005-07-09
gigix 写道
robbin 写道
一直比较反感annotation,把Java代码弄得不像代码的样子,看起来就不爽。

关键是耦合太深。就拿hibernate来说吧,若是用XML,数据库改个字段名,服务器这边只需要改XML文件;若是用annotation,就得改source code,然后recompile。关键是在server上要改东西很可能压根找不到source code,或者找到也不一定有环境编译,这就比较恶心了。

这个的确。
   
0 请登录后投票
时间:2005-07-09
我是感觉,在java中,annotation的出现比较无奈的说,java语言的动态能力比C++好很多,但仍然是静态类型语言,而OO的设计,强调的就是类型可变带来的灵活性(由于算法已经融合到类型里了),这里的矛盾在java中是利用动态加载类,反射及动态代理通过在运行时读取配置信息加载正确的类型来解决。——说白了,就是把类型信息变成用string来描述,然后到配置文件里查找相应的类型信息,进行动态加载。

OK,这样带来的问题就是,配置已经变成另一种形式的代码了,在编译器之外存在的代码。这样的话无异于让一份代码散布于不同的环境,应用稍大的话,会给开发,测试和维护都带来麻烦。

annotation的出现,就是将这部分从新纳入统一的管理,以一种标准的形式。

另外,gigix举的例子不妥,很少有改动是只改改配置文件就能解决的,数据库要是要改的话,基本是一路改到前台的了。用annotation也不是就完全不用配置文件了。使用annotation可以把配置文件变得干净些。

问题没有消失,只是挪个地方解决而已,呵呵

我也不喜欢annotation:( ,如果要用,如TomHornson所说,应该由IDE支持,还好这并不难。象这种MetaData标签,我觉得都应该由IDE来处理。
   
0 请登录后投票
时间:2005-07-09
annotation是为了解决能够扩展类似于关键字的自定义描述性声明而产生的。
所以并不适合于可以灵活配置的领域。正如关键字public,不会随意变为private,interface也不会变为class一样。
通过annotation可以添加以前增加关键字才能解决的问题,而不用重写编译器。

从这个意义上说,annotation并不适合于作为ORM的映射元数据添加到DomainObject上。另外这种映射的稳定程度要比DomainObject低,也是不适合的另一个原因。
   
0 请登录后投票
时间:2005-07-11
就我个人而言,annotation既然与代码出现在一起,那么最好是与代码耦合的比较紧,经常改代码就要改
annotation的例子就比较好。比如拿最近火热的ajax说事,如果在某个method前面指明
@ajax.ajaxMethod,
就是很合适的。要比配在xml里头好。
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐