实验室开发的时候有意识的让系统模块化,分了很多模块,每个模块都是独立的jsp、struts action、业务层、持久层和spring配置文件, 最终的目标是希望能把几个模块的文件拷贝的一起,然后运行一下安装程序就可以跑起来,现在主要还有index.jsp耦合了各个部分,另外就是hibernate实体的关联,关于页面的问题,可以通过portal来解决, 但关于hibernate实体分模块的问题一直没想到好的办法,现在只有个最初的构想:

首先的想法是各个模块的hibernate实体分模块放在模块各自的包里面,然后通过spring的通配符配置:
    <!-- Hibernate SessionFactory -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref local="dataSource" />
        </property>
        <property name="lobHandler">
            <ref bean="${jdbc.lobHandler}" />
        </property>
        <!--    <property name="namingStrategy">
            <ref bean="bupticetNamingStrategy" />
            </property> -->
        <property name="mappingDirectoryLocations">
            <value>
                classpath:/com/bupticet/oa/*/mapping
            </value>
        </property>
        <property name="hibernateProperties">
......


这样一来解决了hibernate实体统一引入的问题,但还有一个问题, 那就是实体之间的关联问题。几乎每个实体都要依赖用户实体,例如消息的发送者与接受者,论坛帖子的发帖者,这样就造成了每次加入新的模块,都要往用户实体里面加入大量的Set,List属性以及getter、setter方法,并且还得加xdoclet标签,重新生成hbm映射文件,很麻烦。现在有3种思路解决这个问题,请各位批评指正:

1、 其它和用户模块之间一对多或者多对多关联都配置成单向关联,但没有试过,以前看夏昕写的hibernateguide说插入数据的时候会抛属性必须非空的异常,并且还会多执行一条hsql语句,性能不好,不知道是不是这样,因此对这种思路有很大怀疑;
2、在hibernate参考手册6.1.3节中有如下这段话:
引用

Implicit (隐式)的多态是指,如果查询时给出的是任何超类、该类实现的接口或者该类的 名字,都会返回这个类的实例;如果查询中给出的是子类的名字,则会返回子类的实例。 Explicit (显式)的多态是指,只有在查询时给出明确的该类名字时才会返回这个类的实例; 同时只有在这个<class>的定义中作为<subclass> 或者<joined-subclass>出现的子类,才会可能返回。 在大多数情况下,默认的polymorphism="implicit"都是合适的。 显式的多态在有两个不同的类映射到同一个表的时候很有用。(允许一个“轻型”的类,只包含部分表字段)。

因此我设置每个需要模块都弄一个用户实体,都统一映射到数据库中的用户表,但只做一个轻型的类,只有用户id、姓名、email等几个最基本的字段,但是这样在利用hibernate自动建表的功能的时候应该有多次创建同名表的问题,另外这种方式除了引用的这一处之外基本上找不到其它任何文档,因此基本上没希望;
3、关联用户的时候不用实体关联,而只有id,例如消息实体里面有发送者id和接受者id属性,这样关联就可以解开,并且还可以把各个模块的数据库放到不同的数据库服务器里面,甚至可以把用户数据存到ldap服务器里面,但是如果仅仅只考虑把它们都放在一个数据库服务器的情况,每次查询都一个一个根据id去取用户数据,这样太慢,如果是手动写代码使用Join子句这样又太麻烦。综合考虑,我个人比较趋向这种思路。

不知道各位对以上三种思路有什么看法, 或者有没其它更好的解决办法?
评论
oyhf521 2006-12-21
遇到同样问题
lijiangt 2006-12-13
我们以前也是这么作的, 但是用户提出需求要求永久删除, 后来只好添加了这个功能。
together 2006-12-13
lijiangt 写道
如果都使用单向关联有一个问题,比如消息中的发送者关联用户,删除用户的时候必须要手动去消息表中一个一个删除用户对应的消息记录,否则就会抛异常,这样耦合程度还是很深啊。

我们的所有系统中,都不做物理删除,只打标记。
lijiangt 2006-12-13
如果都使用单向关联有一个问题,比如消息中的发送者关联用户,删除用户的时候必须要手动去消息表中一个一个删除用户对应的消息记录,否则就会抛异常,这样耦合程度还是很深啊。
lijiangt 2006-12-13
together 写道
引用
那就是实体之间的关联问题。几乎每个实体都要依赖用户实体,例如消息的发送者与接受者,论坛帖子的发帖者,这样就造成了每次加入新的模块,都要往用户实体里面加入大量的Set,List属性以及getter、setter方法,并且还得加xdoclet标签,重新生成hbm映射文件,很麻烦

不需要的吧?只需要在其它的实体里指定对User的关系就可以了。除非你需要使用这个User来直接获取所有与它关联的实体。比如你不仅想知道一个部门下有多少个用户,还想知道这个用户对应了哪个部门。如果对这个不关系,那就没必要在user中再指定关系。


我们为了简单通用,全都配置的是双向关联。你的意思就是单向关联吧? 好, 试一下先。
together 2006-12-13
引用
那就是实体之间的关联问题。几乎每个实体都要依赖用户实体,例如消息的发送者与接受者,论坛帖子的发帖者,这样就造成了每次加入新的模块,都要往用户实体里面加入大量的Set,List属性以及getter、setter方法,并且还得加xdoclet标签,重新生成hbm映射文件,很麻烦

不需要的吧?单向关联也是可以的。只需要在其它的实体里指定对User的关系就可以了。除非你需要使用这个User来直接获取所有与它关联的实体。比如你不仅想知道一个部门下有多少个用户,还想知道这个用户对应了哪个部门。如果对这个不关心,那就没必要在user中再指定关系。
lijiangt
搜索本博客
博客分类
最近加入圈子
存档
最新评论
评论排行榜