这几天在研究些项目,我看的是Struts2 的权威指南的最后一个项目。有几点疑问,有点搞不清楚,请教下大家 :D
1、关于service层的设计,有没必要把service 层设计成接口,然后再具体实现。
比如:UserService 有没必要设计成接口,然后再用 UserServiceImp 把它具体实现,书上是这么设计的,我感觉好像没什么必要,直接用UserService 实现具体的业务操作就行了,实现接口有点多余。。
这有的设计service层的设计原则,一般项目中的service层是怎么设计的呢,一个种类的相关操作对应一个service类??
比如:对User的相关操作对应一个UserService类
2、关于hibernate中实体的在页面中的传输。
具体很难说清楚,还是举个例子说明下清楚点,比如:
Class User{
private String id;
private String name;
private Address address;
}
Class Address{
private String name;
private String code;
}
在hibernate 查询中,如果设置了lazy 的话,当加载User类的时候,Address是不是立即执行查询的。。问题的关键在于,如果我把一个User类的List传输到页面,然后逐个输出User,包括要取出Address里的内容,然而hibernate 的session 已经关闭了,是不能取出Address的,会报错,这时可以采取OpenSessionInView 机制,这样就可以顺利取出的。或者把lazy 设成false,这样也可以取出来了。
还有个办法,我是在书上项目中的书看到的,就是在hibernate session没关闭之前,把Address取出来,新建个UserBean类
Class UserBean{
//把User 的属性都封装进来
private String username;
private String userId;
//把Address 的属性都封装进来
priavte String addressName;
private String code;
}
然后把UserBean 的List 传输到 页面,这样就不会在页面上用到hibernate 的session了。。
开始看到UserBean类的时候有点糊涂了,后来知道了他的作用后,觉得这样做好像有点麻烦,项目中又会多了一个UserBean类,但对于解决页面的实体的传输问题确实是个解决的办法。。
对于这种做法,在项目中常不常见呢,到底真正项目中,是怎么来解决这个问题的。OpenSessionInView??还是用UserBean这个方法??或者其他???
[b]问题补充:[/b]
稍微补充下,除了用到 OpenSessionInView或UserBean的方式,还有没其他方式呢。。
或许更合理些的,这两种方法我觉得都有点缺点。。