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; }}