关于service 层的设计和hibernate中实体的在页面中的传递

这几天在研究些项目,我看的是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的方式,还有没其他方式呢。。
或许更合理些的,这两种方法我觉得都有点缺点。。

面向接口编程,这是优秀的编码方式,基本上的公司都是这么做的,这可以降低耦合嘛,
依赖于接口而不依赖于具体实现类,接口可以有多个实现类,运行时就可以多态替换了
对于小项目也许接口有点多余,但大项目一定都是接口的。

真实的项目中OpenSessionInView或UserBean的方式都有可能,要看项目的实际需求了,看什么方式最合适当前的系统需求,这才是最佳实践

现在这种情况user对address是多对一或一对一,一般都设置为lazy 设成false

面向接口的编程也是一种设计模式,方便解耦。如果你有多个实现类,那么这种模式的好处就显而易见了。
第二个问题:
在web.xml中加个OpenSessionInView 的Filter