`
seara
  • 浏览: 648877 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

eclipse + JBoss 5 + EJB3开发指南(10):通过继承实体Bean,将单个表映射成多个表(单表策略,SINGLE_TABLE)

阅读更多

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:eclipse + JBoss 5 + EJB3开发指南(9):实现Entity Bean的多对多(many-to-many)映射

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

图1 t_accounts表的结构和记录

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

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

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->packageentity;

importjavax.persistence.Column;
importjavax.persistence.DiscriminatorColumn;
importjavax.persistence.Entity;
importjavax.persistence.GeneratedValue;
importjavax.persistence.GenerationType;
importjavax.persistence.Id;
importjavax.persistence.Inheritance;
importjavax.persistence.InheritanceType;
importjavax.persistence.Table;

@Entity
@Table(name
="t_accounts")
@Inheritance(strategy
=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name
="account_type")
publicclassAccount
{
protectedStringid;
protectedfloatbalance;
protectedStringtype;
@Id
@GeneratedValue(strategy
=GenerationType.IDENTITY)
@Column(name
="account_id")
publicStringgetId()
{
returnid;
}
publicvoidsetId(Stringid)
{
this.id=id;
}
publicfloatgetBalance()
{
returnbalance;
}
publicvoidsetBalance(floatbalance)
{
this.balance=balance;
}
@Column(name
="account_type",insertable=false,updatable=false)
publicStringgetType()
{
returntype;
}
publicvoidsetType(Stringtype)
{
this.type=type;
}
}

对于Account类的代码,要注意如下两个注释:

1.@Inheritance

2.@DiscriminatorColumn

@Inheritance注释用于设置实体Bean的继承类型,默认值是InheritanceType.SINGLE_TABLE,也就是单表策略类型。如果使用该继承类型,每一个从该实体Bean继承的表都会被映射成一个子表。而这个子表需要根据一个鉴别字段的值来映射,在本例中该字段是account_type,这个字段由@DiscriminatorColumn注释来指定。还要注意一点的是,由于account_type字段现在被设置成了鉴别字段,因此,该字段值不能由开发人员通过代码动态指定,而必须在Account类的子类中通过注释来指定(在后面会详细介绍),因此,需要使用@Column注释将该字段对应的实体Bean属性设为不可插件和编辑的(insertable=false, updatable=false)。否则在运行程序时会抛出下面的异常:

org.hibernate.MappingException: Repeated column in mapping for entity: entity.SavingsAccount column: account_type (should be mapped with insert="false" update="false")

活期帐户的实体Bean的代码如下:


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->packageentity;

importjavax.persistence.DiscriminatorValue;
importjavax.persistence.Entity;

@Entity
@DiscriminatorValue(
"C")
publicclassCheckingAccountextendsAccount
{
privatedoubleoverdraftLimit;

publicdoublegetOverdraftLimit()
{
returnoverdraftLimit;
}

publicvoidsetOverdraftLimit(doubleoverdraftLimit)
{
this.overdraftLimit=overdraftLimit;
}

}

CheckingAccount类中通过@DiscriminatorValue注释将account_type字段的值设为了C。如果使用CheckingAccount类来映射t_accounts表时,EJB容器会自动将t_accounts表的account_type字段值设为C(并不需要开发人员干预)。

储蓄存款帐户对应的实体Bean的代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->packageentity;

importjavax.persistence.DiscriminatorValue;
importjavax.persistence.Entity;

@Entity
@DiscriminatorValue(
"S")
publicclassSavingsAccountextendsAccount
{
privatedoubleinterestRate;

publicdoublegetInterestRate()
{
returninterestRate;
}

publicvoidsetInterestRate(doubleinterestRate)
{
this.interestRate=interestRate;
}
}

可以下面的代码进行测试:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->CheckingAccountca=newCheckingAccount();
ca.setBalance(
342);
ca.setOverdraftLimit(
120);
em.persist(ca);
//自动将account_type字段的值设为C
SavingsAccountsa
=newSavingsAccount();
sa.setBalance(
200);
sa.setInterestRate(
321);
em.persist(sa);
//自动将account_type字段的值设为S


下一篇:eclipse + JBoss 5 + EJB3开发指南(10):实体Bean连接策略(JOINED Strategy)



国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    ejb3·0入门经典教程

    - **单表映射**: 展示如何创建与单个数据库表对应的实体Bean。 - **属性映射**: 讨论实体Bean中的属性与数据库字段的映射策略。 - **持久化实体管理器ENTITYMANAGER**: 细致讲解ENTITYMANAGER的各种操作,如查询、...

    EJB3.0中文文档

    实体Bean可以映射到数据库中的单个表,其中每个属性对应表中的一个字段。 **3.3 成员属性映射** 具体说明如何将实体Bean的属性映射到数据库表中的字段。 **3.4 建议重载实体BEAN的EQUALS()和HASHCODE()方法** ...

    ejb3入门

    - 创建一个简单的EJB3项目,并通过JBoss AS运行它来验证环境配置是否正确。 **3. 在独立环境中调用EJB** - **TOMCAT**: 在独立的Tomcat服务器中部署Web应用并通过远程接口调用EJB。 - **SWING**: 在Swing桌面应用中...

    EJB 3.0实例教程(pdf)

    - **单表映射**:解释单表映射的概念,以及如何实现基于单个数据库表的实体Bean。 - **实体管理器EntityManager**: - **基本操作**:涵盖获取、添加、更新、删除实体的基本方法。 - **查询操作**:包括EJB 3QL和...

    EJB3.0 实例教程

    本节将探讨如何将实体Bean映射到多个数据库表上。 **3.7 持久化实体管理器 ENTITY MANAGER** 实体管理器(EntityManager)是EJB 3.0中用于处理实体Bean的核心API。本章节将详细介绍其主要功能: - **3.7.1 实体的...

    东北大学EJB实验报告

    3. **部署与测试**:将EJB组件打包成JAR或EAR文件,部署到EJB容器中,通过Web服务或者Java客户端进行调用和测试。 4. **事务管理**:学习如何配置和管理EJB的事务属性,确保数据的一致性和完整性。 5. **安全性**...

    EJB2.0一个完整的Helloworld

    开发完成后,将EJB打包到ejb-jar文件,然后放入一个EAR(Enterprise Archive)文件,包含ejb-jar、Web应用和其他相关资源。最后,将EAR部署到支持EJB 2.0的服务器,如JBoss或WebLogic。 ### 7. 性能和优化 EJB 2.0...

    ejb3.0实例教程

    - **单表映射**: 实体Bean对应数据库中的单个表,属性映射到表的字段。 - **实体管理器(EntityManager)**: - **实体状态**: 管理实体的生命周期,如新建、修改、删除等。 - **持久化操作**: 如`persist()`、`...

    EJB搭建

    5. **打包和部署**:将EJB模块与其他模块(如Web模块)一起打包成EAR(Enterprise Archive)文件,然后通过应用服务器的管理控制台或命令行工具进行部署。 6. **测试和调用**:可以编写客户端代码来测试EJB组件,...

    J2EE初学者开发文档

    - **实体Bean(Entity Beans)**:映射到数据库中的持久化对象,代表业务实体。 - **消息驱动Bean(Message-Driven Beans)**:处理JMS(Java Message Service)消息,实现异步处理。 **4. JDBC(Java Database ...

    java_学习资料

    - **多对多关联**:通常需要一个关联表来维护这种关系。 - **HQL查询** - **实体查询**:如`from Person p where p.name = 'John'`。 - **属性查询**:如`select p.name from Person p`。 - **绑定参数查询**...

    EJB-excercises:简单的EJB练习(出于学习目的)

    **EJB(Enterprise JavaBeans)**是Java EE平台的核心组件之一,主要用于构建可复用、模块化的后端服务器端应用。EJB提供了一种规范化的框架,使得开发人员可以集中精力于业务逻辑,而无需过多关注底层的分布式计算...

Global site tag (gtag.js) - Google Analytics