导航

看看 EJB 3.0 的 O/R Mapping

Posted on 2006-06-16 04:38  yysun  阅读(2592)  评论(6编辑  收藏  举报

现在主要做 .NET,但是每过一段时间总是要回头看看 Java 世界。看到了新的 EJB 3.0 spec。联想到最近这里有不少 ORM 的讨论,就顺便推荐大家看看这个 Java Persistence API in 60 Minutes

Java 中的 Annotation 就是 .NET 中的 Attribute。虽然 Java 中有这个东东比 .NET 晚,但是通过 EJB 3.0,Java 世界把 Annotation 发挥得更加淋漓尽致,ORM, Dependency Injection, AOP ... 。这正是士别三日,当刮目相看。

长久以来,一直觉得 .NET 缺乏的是 Container 这个概念。 MTS 实在 Sucks。EJB 以前当然也 Sucks。人们甚至觉得 EJB 带来的问题比解决的问题多。这两个因素掩盖了 container 的重要性。加上 SOA 这个 Buzz word 又转移了一部分注意力。

现在的 EJB 3.0 借助 Annotation 实现了瘦身,完全回到了 POJOs 的路线上来。顿时感到一阵清风。

很希望看到 .NET 世界也出个类似的 Container 。NHibernate?
没有 Container 的情况下, ORM 也没有多少意义。

[Update] 谢谢下面很多好的评论。联想到了 Annotation (注记) 与 Attribute (属性) 的用法。

一是静态的 MetaData。告诉使用者我是什么,比如 [Serializable] 。二是动态的,在 Container 配合下,请它帮我做点什么。例如 [ServiceDependecy] 就是告诉 ObjectBuilder 这个 Container 用 Dependcy Injection 帮我初始化。@Remote 就是告诉 EJB Container,有人远程叫我得时候,你想办法把我送出去 ...。通过 Container 进行功能扩充后,我自己集中做我得事情,不必顾及其他方面的细节(AOP的精髓)。所以,这就可以用 POJO 来解决主要的业务,加个注记,扔给 EJB Contain,让它变成 Stateless Session Bean。加个注记,扔给 EntityManager,让它保存到什么地方去,Table, XML ...。 

Dependcy Injection 相对简单些,在 Container 的什么 Collection 中找到想要的东西。 Interception 和 Dynamic Proxy 则相对复杂些,一般需要 Emit 新的类出来。Deployment (发布) 因此有了新的含义。在发布的时候动态生成程序 Emit dynamic proxy during deployment 是个很有意思的方向。