Hibernate心得

以前使用hibernate的时候关系都是根据业务来处理的,也就是对象间的关系没有设置,仅仅设置一个ID外键来做关联,感觉对象的管理蛮方便的,研究了领域驱动设计很长时间了。最近一个项目使用了hibernate的关系,但是怎么处理起来都觉得别扭,举个例子:
用户和用户组以及角色三个实体:即:User,UserGroup,Role他们的关系为User和UserGroup为many-to-many,UserGroup和Role为many-to-many,关系都为双向的。
开始的整体结构为:
dao层:封装简单的dao的操作,没有处理关联关系
service层:处理业务逻辑,涉及到关系的处理,调用dao层
别扭得地方:
1.如果在UserGroup对User上设置了级联插入关系:
那么当插入UserGroup的时候,UserGroup中的User集合也会插入,但是这个时候如果有业务上的要求,用户名必须唯一,级联插入的时候抛异常,的确这个情况我们还是可以处理的,但是必须知道会抛什么异常,然后catch住了之后,抛出自己的业务异常,感觉处理起来不是很流畅,如果在User设置对UserGroup级联插入,情况可能更复杂,比如UserGroup对Role也设置了级联插入。不知道这种情况大家如何处理。
2.如果所用的级联关系都没有设置,全部由业务来决定
a.如果用户在前台在保存User时,设置了User中的UserGroup集合,但是UserGroup集合并没有在库中,那么我们要先保存UserGroup集合到数据库中,同时UserGroup又包含Role的集合,也是先保存到数据库中,因为是EJB项目涉及到远程调用,确保一次调用能做更多的操作。
    这样的话,会发现UserService会有很多代码会和UserGroupService相同,因为保存User的时候涉及到UserGroup保存,可能还会涉及到查找,这样如果不是代码copy,就是UserService依赖UserGroupService显然不合理,当然UserGroup和UserService可以合并成一个Service,但是可能会导致合并后的Service膨胀。可能是Service划分不合理,不知道大家是怎么处理的。
b.鉴于以上原因UserGroupService和UserService仅仅处理简单的插入,处理简单的关系,然后提供一个供远程调用的会话门面,门面中包含UserGroupService和UserService,然后处理关系,可以很好解决a中遇到的情形,但是会发现service中有很多方法只是简单的调用dao中的方法,另外门面中也有很多方法只是简单的调用service中的方法,感觉处理的很别扭。
    各位牛人,大家一起交流一下,不知道大家理解清楚了没有?

你可能感兴趣的:(DAO,数据结构,Hibernate,ejb,项目管理)