那必须在调用EntityBean Create方法前,得到序列的下一个值,传进create方法里面就可以了。
解决方案 »
- 提交表单,不表空内容,在线等
- 请教一下查API的一些技巧
- DWR问题
- Struts1.x中 struts-config.xml的forward的contextRelative的问题,非常迷惑,快崩溃了
- Cannot retrieve definition for form bean 错误,请看完再回答,有一定挑战!
- 移植jsp+struts网站到linux上的问题,移过去后访问不了数据库mysql
- 求Together Edition for JBuilder X Developer 和 Together CC 6.2 的Keymaker!
- tomcat中的Context path 起和作用 那位能详细的说下 谢谢
- 如何让java程序(或Jsp)定时自动执行?
- 【求助】关于docker中单独安装centos问题
- 请问java的applet和window的active在web上运行速度相比,哪一个快一些?
- xslt中,如何把#等特殊符号表示成文本?我要用匹配if test=“ ”
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;import java.sql.SQLException;
import java.rmi.RemoteException;
import javax.naming.NamingException;
import javax.ejb.CreateException;
import javax.ejb.EJBException;public class SequenceBean implements SessionBean { // ==== session bean related ==== public void ejbCreate() throws CreateException, EJBException { init(); }
public void ejbRemove() throws EJBException { }
public void ejbActivate() throws EJBException { }
public void ejbPassivate() throws EJBException { }
private SessionContext ctx;
public void setSessionContext(SessionContext context) throws RemoteException, EJBException { ctx = context; } // ==== properties ====
static final private String classname = SequenceBean.class.getName();
static final private Loger log = Loger.getInstance(classname); /**
* @RESOURCE-REF
* @ResourceRefAuth Application
* @ResourceRefType javax.sql.DataSource
* @ResourceRefRemoteType local
*/
static final private String dataSourceName = "java:comp/env/jdbc/yourDataSource";
private DataSource dataSource = null; private void init() throws CreateException, EJBException {
try {
InitialContext ic = new InitialContext();
dataSource = (DataSource) ic.lookup(dataSourceName);
} catch (Exception e) {
log.debug("init",e);
}
} // ==== bussiness methods ==== public Long getNext(String sequenceName) {
Long value = null;
Connection con = null;
try {
con = dataSource.getConnection();
String sql = "select " + sequenceName + ".nextval nextId from dual";
PreparedStatement prepStmt = con.prepareStatement(sql);
ResultSet rs = prepStmt.executeQuery();
if (rs.next()) {
value = new Long(rs.getLong(1));
}
rs.close();
prepStmt.close();
} catch (Exception e) {
log.debug("getNext",e);
} finally {
try { con.close(); } catch (Exception anye) { }
}
return value;
}
}( local home 和 local 接口略 )创建的时候:( stateful sessionbean 中引用 local 的 sessionbean (Sequence) 以及 local 的 entitybean (User) ) try {
Long userId = sequenceLocal.getNext(userSeqenceName);
user = new UserDto(userId, userName, userPass, userEmail);
userLocalHome.create(user);
} catch (Exception e) {
log.debug(e);
throw new EJBException( new YourSystemException("createUser failure", e) );
}注意,本版另一个帖子中,有一位“牛人同志”严肃批评了程序中 sequence 使用的想法,请自行决定是否采用 sequence 的设计。
详情可以参考:“请问在CMP中如何处理自动增长的主键?”一贴。