区别大了
SessionBean在用户会话结束后就自动销毁了,也就是说你虽然可以进行数据库操作,但是仅限于会话,而且BMP的许多生命期函数是容器自动调用的,通过这些函数你可以方便的实现BMP和数据库中的数据保持一至,如果你用SessioBean就必须自己写这些保持数据一致的程序,而且你要不时地考虑到它们.
简单说:BMP很容易将数据纪录映射到具体的类实例,从而被容器自动管理,而你用SessionBean仅限于数据操作而已.
要详细你还是看书吧.
SessionBean在用户会话结束后就自动销毁了,也就是说你虽然可以进行数据库操作,但是仅限于会话,而且BMP的许多生命期函数是容器自动调用的,通过这些函数你可以方便的实现BMP和数据库中的数据保持一至,如果你用SessioBean就必须自己写这些保持数据一致的程序,而且你要不时地考虑到它们.
简单说:BMP很容易将数据纪录映射到具体的类实例,从而被容器自动管理,而你用SessionBean仅限于数据操作而已.
要详细你还是看书吧.
两种方法我都用过,BMP方便点,在SessionBean里麻烦点,不过其他的东西我还体会不到什么
你说的“BMP的许多生命期函数是容器自动调用的,通过这些函数你可以方便的实现BMP和数据库中的数据保持一至,如果你用SessioBean就必须自己写这些保持数据一致的程序,而且你要不时地考虑到它们”能举个简单的例子吗?
InitialContext ic = new InitialContext();
UserTransaction ut = ejbContext.getUserTransaction();
ut.begin();
.........如果用BMP,在事务处理方面,是不是就不需要写类似这样的代码了?
只要在部署文件中写就可以了?
奇怪,为什么会话bean就没有容器事务管理了?我怎么总记得一样也有的呀?
UserTransaction ut=null;
PreparedStatement pstm=null; try{
InitialContext ic = new InitialContext();
ut = sessionContext.getUserTransaction();
ut.begin();
javax.sql.DataSource ds = (javax.sql.DataSource) ic.lookup("DataSource");
conn = ds.getConnection();
String sql="insert into test(name,email) values(?,?)";
pstm=conn.prepareStatement(sql);
pstm.setString(1,"John");
pstm.setString(2,"[email protected]");
pstm.execute();
ut.commit();
}catch(SQLException e){
System.out.println("SQLException:" + e.getMessage());
}catch(Exception e){
System.out.println("Exception:" + e.getMessage());
}编译、部署都没问题,但在CLIENT端调用这个BEAN的时候,出现下面的异常:
Exception:Only instances of beans with bean-managed transaction demarcation can use getUserTransaction().是不是不能在无状态SessionBean
<transaction-type>Container</transaction-type>
应该改为Bean