📄 accountbean.java
字号:
//定义本接口在包examples.ejb.basic.containerManaged中
package examples.ejb.basic.containerManaged;
//本类用到的其他类。javax.ejb.*是开发EJB应用需要的类库。javax.naming.*是实现JNDI服务需要的类库。
import java.io.Serializable;
import java.util.Enumeration;
import java.util.Vector;
import javax.ejb.CreateException;
import javax.ejb.DuplicateKeyException;
import javax.ejb.EJBException;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
import javax.ejb.FinderException;
import javax.ejb.NoSuchEntityException;
import javax.ejb.ObjectNotFoundException;
import javax.ejb.RemoveException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
/**
* AccountBean是实体EJB,它演示了:
* 容器管理的JDBC持续性管理和事务管理;
* 在这个文件中的代码并没有直接访问数据库;
* 用户定义的异常;
* 使用isModified方法,这个方法改变容器管理的字段,通过设置isDirty
*/
//这个类是实体Bean,必须实现接口 EntityBean
public class AccountBean implements EntityBean {
//设置是否打印控制台
final static boolean VERBOSE = true;
//声明实体上下文变量
private EntityContext ctx;
//声明实体EJB属性变量
public String accountId; // 这也是主键类
public double balance;
public String accountType;
private transient boolean isDirty; // 决定bean是否谢数据库的标志
/**
* 为EJBean设置实体EJB上下文
*
* @参数 ctx EntityContext
*/
public void setEntityContext(EntityContext ctx) {
log("setEntityContext called (" + id() + ")");
this.ctx = ctx;
}
/**
* 取消实体上下文设置
*
*/
public void unsetEntityContext() {
log("AccountBean.unsetEntityContext (" + id() + ")");
this.ctx = null;
}
/**
* 返回EJBean是否被改变
*
* 这个方法必须为public 以使被容器调用
*
* @返回 boolean isDirty
*/
public boolean isModified() {
log("isModified(): isDirty = " + (isDirty ? "true" : "false"));
return isDirty;
}
/**
* 设置EJBean的改变标志
*
* @参数 flag 改变标志
*/
public void setModified(boolean flag) {
isDirty = flag;
log("setModified(): " + id() + (String) (flag ? ": requires saving"
: ": saving not required"));
}
/**
* 返回标识这个EJBean的主键
*
* @返回 String 标志
*/
private String id() {
return "" + System.identityHashCode(this) + ", PK = " +
(String) ((ctx == null) ? "nullctx"
: ((ctx.getPrimaryKey() == null ?
"null" : ctx.getPrimaryKey().toString()))) +
"; isDirty = " + isDirty;
}
/**
* 这是本类必须实现的方法,在本例中没有用到
*
*/
public void ejbActivate() {
log("AccountBean.ejbActivate (" + id() + ")");
}
/**
* 这是本类必须实现的方法,在本例中没有用到
*
*/
public void ejbPassivate() {
log("AccountBean.ejbPassivate (" + id() + ")");
}
/**
* 这是本类必须实现的方法,在本例中没有用到
*
*/
public void ejbLoad() {
log("AccountBean.ejbLoad (" + id() + ")");
}
/**
* 设置EJBean的改变标记为false
*
*/
public void ejbStore() {
log("AccountBean.ejbStore (" + id() + ")");
setModified(false);
}
/**
* 这是本类必须实现的方法,在本例中没有用到
*
*/
public void ejbRemove()
throws RemoveException
{
log("AccountBean.ejbRemove (" + id() + ")");
}
/**
* 这个方法和"AccountBean.java"中定义的的Bean的"ejbCreate"方法相对应
* 这两个方法的参数应该相同。当客户端调用"TraderHome.create()"方法时,EJB容器
* 会找到EJBean的实例,并调用它的"ejbCreate()"方法。
* 对容器管理的ejb,ejbCreate方法返回为null,而bean管理的ejb,返回的是主键类。
* @参数 accountID String 账号ID
* @参数 initialBalance double 初始化结算值
* @参数 type String 账号类型
* @异常 javax.ejb.CreateException
* 创建bean错误时抛出的异常
* @参看 examples.ejb.basic.containerManaged.AccountHome
*/
public String ejbCreate(String accountId, double initialBalance, String type)
throws CreateException
{
log("AccountBean.ejbCreate( id = " + System.identityHashCode(this) + ", PK = " +
accountId + ", " + "initial balance = $ " + initialBalance + ")");
this.accountId = accountId;
this.balance = initialBalance;
this.accountType = type;
return null; // See 9.4.2 of the EJB 1.1 specification
}
/**
* 这是本类必须实现的方法,在本例中没有用到
*/
public void ejbPostCreate(String accountId, double initialBalance, String type)
{
log("AccountBean.ejbPostCreate (" + id() + ")");
}
// 应用程序定义的方法
/**
* 存入一定金额
*
* @参数 amount double 数量
* @返回 double 结算
*/
public double deposit(double amount)
{
log("AccountBean.deposit: Depositing $" + amount + " into '" + accountId + "'");
//业务逻辑计算
balance += amount;
//设置改变标记
setModified(true);
return balance;
}
/**
* 提取一定数量的金额
*
* @参数 amount double 数量
* @返回 double 结算
* @exception ProcessingErrorException
* 如果提取的数量大于结算值
*/
public double withdraw(double amount)
throws ProcessingErrorException
{
log("AccountBean.withdraw: Withdrawing $" + amount + " from '" + accountId + "'");
if (amount > balance) {
//抛出用户定义异常
throw new ProcessingErrorException("Request to withdraw $" + amount +
"; is more than balance $" + balance +
" in account " + accountId);
}
//业务逻辑计算
balance -= amount;
//设置改变标记
setModified(true);
return balance;
}
/**
* 返回当前的结算
*
* @返回 double 结算
*/
public double balance() {
log("AccountBean.balance (" + id() + ")");
return balance;
}
/**
* 返回账号类型
*
* @返回 String 账号类型
*/
public String accountType() {
log("AccountBean.accountType (" + id() + ")");
return accountType;
}
//控制台输出
private void log(String s) {
if (VERBOSE) System.out.println(s);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -