日期:2014-05-20  浏览次数:20756 次

hibernate生成的abstraceModel和Model和ModelDAO,不想修改,在此条件下如何分层?
现在是这样的。

action.Login struct的Login被激活之后,调用biz.Login
biz.Login 调用 UserManager中的方法判断是否登录成功,如果成功就设置session什么的。
modelmanager.UserManager 提供针对业务逻辑的CRUD,调用po来处理,但给上层biz.Object提供的尽量都是非持久化VO对象。
model.UserDAO 提供针对字段的CRUD
model.User model.AbstractUser 映射表结构



myelipse hibernate生成的abstraceModel和Model和ModelDAO,不想修改,在此条件下如何分层?

比如User表,hibernate生成了 abstractUser User UserDAO 三个东西

因为表结构修改之后,要用myeclise重新生成,因此

ModelDAO和abstractUser 是绝对不可以手工动的,Model可以加一些东西,但我只加一些辅助字段和一些加载辅助数据的方法。



我自己写了ModelManager来实现跟业务逻辑相关的针对User的处理。ModleManager跟Model没有继承关系。


因为不想把持久了的po对象传给ObjManager的外层(比如action, servlet),因此ObjManager返回的都是vo对象。


问题1 比如买书(还要从user属性中扣钱),这个动作,是放在ModelManager里,还是放在User里。

如果放在user里,就冲突了,因为biz.逻辑层拿到的user是vo对象,逻辑层调用user.buybook()之后,可能数据库已经修改了,但是逻辑层的user这个对象本身的属性没有修改。


问题2 还有没有更简洁也不失层次的方法,我觉得这种方法太麻烦了。

------解决方案--------------------
描述这么多,看的吃力,以后不如直接上代码,我也没看全。

ModelDAO和abstractUser 是绝对不可以手工动的。
为什么不可以?又不是真理,生成的代码本来就是为了减少开发人员工作量。

作为DAO层,你可以写一个类继承HibernateDaoSupport(hibernate那个类忘记了),里面写你需要的方法,当然是直接与数据库底层交互的

abstractUser你可以当做User的一个接口(至少我从来没用过),只写与数据库相关的字段与其get和set方法

在你的中间层(你描述为逻辑层)写具体的业务实现,操作abstractUser,最直观的是"from abstractUser"
dao.buybook(sql);

控制层struts负责传送前台数据到中间层处理与转向页面