关于J2ee标准SB+CMP以及SB+DAO的疑惑

因为平时做的都是基于开源的hibernate,struts的Web App
所以,用jsp->Struts(MVC)->bo(po加上逻辑方法)->DAO->po->DB
很舒服的设计开发.

可是最近小弟受了点刺激,去sun面试,被问知EJB开发,无语.所以最近研究使用EJB的开发模式.

如果在SessionBean的方法中调用pojo,pojo加上逻辑方法,这些方法中调用DAO对象,DAO对象方法内再调用操作CMP.这样可以吗?

好象通用的方法是SessionBean直接在它方法内部操作CMP.不过,我个人讨厌这样,因为这样一个逻辑对象就失去了它自己的逻辑操作.(下面例子)

逻辑对象:Student类
public class Student{
private String name=null;
String getName();
void setName(String name);
}

如果不只是当成传值对象,那么可以这样.
public class StudentBO extend Student{
void invalideName();
}

以前应用中(hibernate),其中invalideName()可以调用StudentDAO的操作.
如:
void invalideName(){
this.setName(null);
StudentDAO.save(this);
}

public class StudentDAO{
//do something hibernate do for us
}


但是现在(EJB),Student只能当成一个传值对象,那么StudentBo的相关操作应该写在那里??难道做一个stateless SB? StudentSB,里面方法都是invalideName(Student)???

我个人认为,stateless sb只是用来封装如StudentBO这种对象的逻辑操作的.一个方法是一个事务.不应该是来封装Student.invalideName()这种和对象紧密相关的逻辑操作的.
如:

StudentEJB{
void leaveSchool(Student s,Teacher t){//退学
s.knowThat();
t.invalidName();
}

哪个大哥来给小弟说说j2ee(EJB)开发中普通开发怎么来分层实现的,特别是逻辑层,如果不用DAO,只有SB\CMP,怎么划分逻辑??最好简单写写!拜托!小弟实在不解.......


实际上你说的dao被session bean + bmp/cmp替代了,orm不用自己写了,这个倒是很舒服的.
session bean就是封装业务逻辑的地方,bmp/cmp负责数据持久.这样重用性已经非常的高了,扩展性也很高了,各层分开了.
如果你觉得在servlet/struts action中调用session bean比较不习惯的话,你可以把session bean中的方法,封装到一个javabean中,就是你以前的dao对象,但是数据持久或者业务逻辑全部委托给session bean就ok了

一般就是这样:jsp(html)/servlet(struts action)/javabean/session/entity bean/db