本文为原创,如需转载,请注明作者和出处,谢谢!
上一篇:eclipse + JBoss 5 + EJB3开发指南(9):实现Entity Bean的多对多(many-to-many)映射
如果以前使用过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的前三个字段,代码如下:
<!--<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开发速学宝典》出版,欢迎定购
分享到:
相关推荐
- **单表映射**: 展示如何创建与单个数据库表对应的实体Bean。 - **属性映射**: 讨论实体Bean中的属性与数据库字段的映射策略。 - **持久化实体管理器ENTITYMANAGER**: 细致讲解ENTITYMANAGER的各种操作,如查询、...
实体Bean可以映射到数据库中的单个表,其中每个属性对应表中的一个字段。 **3.3 成员属性映射** 具体说明如何将实体Bean的属性映射到数据库表中的字段。 **3.4 建议重载实体BEAN的EQUALS()和HASHCODE()方法** ...
- 创建一个简单的EJB3项目,并通过JBoss AS运行它来验证环境配置是否正确。 **3. 在独立环境中调用EJB** - **TOMCAT**: 在独立的Tomcat服务器中部署Web应用并通过远程接口调用EJB。 - **SWING**: 在Swing桌面应用中...
- **单表映射**:解释单表映射的概念,以及如何实现基于单个数据库表的实体Bean。 - **实体管理器EntityManager**: - **基本操作**:涵盖获取、添加、更新、删除实体的基本方法。 - **查询操作**:包括EJB 3QL和...
本节将探讨如何将实体Bean映射到多个数据库表上。 **3.7 持久化实体管理器 ENTITY MANAGER** 实体管理器(EntityManager)是EJB 3.0中用于处理实体Bean的核心API。本章节将详细介绍其主要功能: - **3.7.1 实体的...
3. **部署与测试**:将EJB组件打包成JAR或EAR文件,部署到EJB容器中,通过Web服务或者Java客户端进行调用和测试。 4. **事务管理**:学习如何配置和管理EJB的事务属性,确保数据的一致性和完整性。 5. **安全性**...
开发完成后,将EJB打包到ejb-jar文件,然后放入一个EAR(Enterprise Archive)文件,包含ejb-jar、Web应用和其他相关资源。最后,将EAR部署到支持EJB 2.0的服务器,如JBoss或WebLogic。 ### 7. 性能和优化 EJB 2.0...
- **单表映射**: 实体Bean对应数据库中的单个表,属性映射到表的字段。 - **实体管理器(EntityManager)**: - **实体状态**: 管理实体的生命周期,如新建、修改、删除等。 - **持久化操作**: 如`persist()`、`...
5. **打包和部署**:将EJB模块与其他模块(如Web模块)一起打包成EAR(Enterprise Archive)文件,然后通过应用服务器的管理控制台或命令行工具进行部署。 6. **测试和调用**:可以编写客户端代码来测试EJB组件,...
- **实体Bean(Entity Beans)**:映射到数据库中的持久化对象,代表业务实体。 - **消息驱动Bean(Message-Driven Beans)**:处理JMS(Java Message Service)消息,实现异步处理。 **4. JDBC(Java Database ...
- **多对多关联**:通常需要一个关联表来维护这种关系。 - **HQL查询** - **实体查询**:如`from Person p where p.name = 'John'`。 - **属性查询**:如`select p.name from Person p`。 - **绑定参数查询**...
**EJB(Enterprise JavaBeans)**是Java EE平台的核心组件之一,主要用于构建可复用、模块化的后端服务器端应用。EJB提供了一种规范化的框架,使得开发人员可以集中精力于业务逻辑,而无需过多关注底层的分布式计算...