service层处理的内容?

我一直对j2ee里面service层所处理的内容不太理解,它调用DAO,再提供出方法给action使用.
如今有这样一个业务:在一个论坛系统中,用户可以对一条贴子做"顶"、"踩"操作.在数据库中有字段"up"和"down"用于记数。
以于这个业务我有三种设想:
1. Action里调用service层查询pojo对象的方法拿到该条记录后将up属性加1后再调用service层的update(pojo)的方法。
2. Action里调用service层里一个叫up(int id)的方法,该方法的实现是调用DAO的up方法(该方法会将up字段加1).
3. Action里调用service层里一个叫up(int id)的方法,该方法的实现是调用DAO的查询pojo对象方法,再更新pojo的up属性,再调用DAO的更新pojo对象的方法.

请大家帮我分析一下哪种设想才是真正service的设计模式,或者都不是...能把理由说清楚点就最好了,哪有service的详细介绍的能推荐一下吗?

假设你的POJO叫Topic

方式一:在POJO里定义
给Topic加两个方法:
[code="java"]
public void goUp(){
this.up++;
}
public void goDown(){
this.down++;
}
[/code]
然后
[code="java"]
TopicService tService = ...;
Topic topic = tService.get(id);
topic.goUp();
tService.update(topic);
[/code]

方式二:你也可以在Service里定义
[code="java"]
public void goUp(Topic topic){
topic.setUp(topic.getUp()++);
this.save(topic);
}
[/code]

我个人喜欢第一种。。。

严格的讲,第三种是,DAO只是数据访问对象,负责封闭数据的访问,与应用逻辑无关,Action大多数情况下的作用是封装下对象和转发。

服务层处理业务逻辑,DAO封装Entity对象,Action作为Controller处理分发。
业务逻辑是最容易变化的地方,当业务改变时,只增加修改相应的代码即可。真正享受分层带来的益处。

我补充一些,这种增加1的操作,不要放在代码里面,高并发的时候,会出现统计错误的,除非你对这些方法做同步,成本太高。

建议直接在SQL语句里面让那个字段自增1。