Welcome 微信登录

首页 / 软件开发 / JAVA / eclipse + JBoss 5 + EJB3开发指南(10)

eclipse + JBoss 5 + EJB3开发指南(10)2011-09-18 blogjava 哈佛校训通过继承实体Bean,将单个表映射成多个表(单表策略,SINGLE_TABLE)

如果以前使用过EJB1.x或EJB2.x的实体Bean,会发现无法通过继承实体Bean将单个表分成多表。而在 EJB3中,我们很容易实现这个功能。先看看图1所示的表结构和记录。

图1 t_accounts表的结构和记录

在t_accounts表中,有一个account_type字段。这个字段是一个长度为1的String类型字段。只能取两 个值:C和S。如果该字段值为C,表示活期帐户(CheckingAccount),如果该字段值为S,表示储蓄存款 帐户(SavingsAccount)。t_accounts表的前三个字段(account_id、balance和account_type)是活期 帐户和储蓄存款帐户都需要的,而interestrate只对储蓄存款帐户有意义,overdraftlimit只对活期帐户 有意义。因此,我们可以将t_accounts表分成两个表,当account_type的值为C时和S时各为一个表。

如果使用EJB3的实体Bean,可以先编写一个Account类来封装t_accounts的前三个字段,代码如下:

package entity;import javax.persistence.Column;import javax.persistence.DiscriminatorColumn;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Inheritance;import javax.persistence.InheritanceType;import javax.persistence.Table;@Entity@Table(name="t_accounts")@Inheritance(strategy=InheritanceType.SINGLE_TABLE)@DiscriminatorColumn(name="account_type")public class Account{    protected String id;    protected float balance;    protected String type;    @Id    @GeneratedValue(strategy=GenerationType.IDENTITY)    @Column(name="account_id")    public String getId()    {        return id;    }    public void setId(String id)    {        this.id = id;    }    public float getBalance()    {        return balance;    }    public void setBalance(float balance)    {        this.balance = balance;    }    @Column(name="account_type",insertable=false, updatable=false)    public String getType()    {        return type;    }    public void setType(String type)    {        this.type = type;    }}