最近项目接触的新架构让我对Spring和Hibernate又有了新的认识,以前使用Hibernate的时候并不是从真正的ORM角度来考虑的,我想ORM真正的目的是让我们不需要去关注数据库表与表之间的关系,而是考虑Entity对象之间的关系,将关注点从表与表之间转移到对象与对象的关系上。
以前在使用hibernate的时候,经常由middlegen或其他工具生成Entity类后就不再改动,或者只对一些字段属性进行改动,而现在这个架构在使用的时候,所有的entity之间的业务逻辑都是实现在entity类里面,如有Account, User, Balance这三个实体类,一个User可能有多个Account, 一个Account的对应一个Balance,如果需要添加一个新的User,同时再创建一个默认的Account, 这样的逻辑我以前会把他们都在Service层中实现,而现在的做法是直接在User类中设置一个addAccount的方法,在createUser的时候进行调用,而创建User时则是调用一个Factory进行创建。这样就将业务逻辑全部封装在entity类中,除了一些查询之外,而这写对象也就成了domain对象。
当然,在客户端调用的时候我们还是通过一个Service来调用domain对象的,这个Service是由Spring维护的,在每个service方法中都会存在Hibernate的Session,这样在持久化的时候,只需要flush一下就可以将所有的domain对象持久化到数据库中。在当前框架中,表现层使用的是GWT,而hibernate session则使用Spring的SessionInViewInterceptor将session一直传播到表现层,这样在Lazyload的时候就不会出现问题。所有domain对象的ID都是由AspectJ静态织入,因为在使用的时候,要避免对ID进行操作,如根据ID进行查找之类的,因为ID都是无业务的主键。
在hibernate mapping file中,所有实体的关系都体现在里面,包括subclass, map,list之类的数据结构,这些结构之前我很少用到,看来对hibernate的理解还是有些差异,仅仅局限在了简单的使用上,却忘了其精髓----ORM,从对象的角度考虑