博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
eclipse + JBoss 5 + EJB3开发指南(11):实体Bean的连接策略(JOINED Strategy)
阅读量:6158 次
发布时间:2019-06-21

本文共 3430 字,大约阅读时间需要 11 分钟。

 
在上一篇文章中,使用单表策略将一个表从逻辑上分成了多个表。但这样可能会造成空巢字段,也就是说,一个逻辑表只由部分字段组成,而物理的表的很多字段的值就会为
null
。为了解决这个问题,可以将
t_accounts
表物理地分成多个表。为了与
t_accounts
表进行对比,新建一个
t_myaccounts
表,结构如图
1
所示。
 


图1  t_myaccounts表
    从t_myaccounts的结构可以看出,在该表中只包含了t_accounts表的前三个字段,而后两个在逻辑上分到了不同的表,因此,首先要建立两个物理表:t_checkingaccount和t_savingsaccount。这两个表的结构如下:
图2  t_checkingaccount表
图3  t_savingsaccount表
    在t_checkingaccount和t_savingsaccount表中都有一个account_id,这个account_id的值依赖于t_myaccounts表中的account_id。
    下面先来编写与t_myaccounts对应的实体Bean,代码如下:
    
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_myaccounts
"
)
@Inheritance(strategy
=
InheritanceType.JOINED)
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
"
)
    
public
 String getType()
    {
        
return
 type;
    }
    
public
 
void
 setType(String type)
    {
        
this
.type 
=
 type;
    }
}
 
从上面的代码可以看出,只使用了@Inheritance
对实体Bean
进行注释。
    
下面编写MyCheckingAccount
MySavingsAccount
类的代码:
MyCheckingAccount
类的代码:
package
 entity;
import
 javax.persistence.Column;
import
 javax.persistence.DiscriminatorValue;
import
 javax.persistence.Entity;
import
 javax.persistence.Id;
import
 javax.persistence.PrimaryKeyJoinColumn;
import
 javax.persistence.Table;
@Entity
@Table(name
=
"
t_checkingaccount
"
)
//
  指定与Account类共享的主键名
@PrimaryKeyJoinColumn(name
=
"
account_id
"
public
 
class
 MyCheckingAccount 
extends
 Account
{
    
private
 
double
 overdraftLimit;
    
public
 MyCheckingAccount()
    {
      
//
  为account_type字段赋默认值
        setType(
"
C
"
);
    }
    @Column(name
=
"
overdraft_limit
"
)
    
public
 
double
 getOverdraftLimit()
    {
        
return
 overdraftLimit;
    }
    
public
 
void
 setOverdraftLimit(
double
 overdraftLimit)
    {
        
this
.overdraftLimit 
=
 overdraftLimit;
    }
}
MySavingsAccount类的代码:
package
 entity;
import
 javax.persistence.Column;
import
 javax.persistence.DiscriminatorValue;
import
 javax.persistence.Entity;
import
 javax.persistence.Id;
import
 javax.persistence.PrimaryKeyJoinColumn;
import
 javax.persistence.Table;
@Entity
@Table(name
=
"
t_savingsaccount
"
)
@PrimaryKeyJoinColumn(name
=
"
account_id
"
public
 
class
 MySavingsAccount 
extends
 Account
{
    
    
private
 
double
 interestRate;
    
public
 MySavingsAccount()
    {
      
//
  为account_type字段赋默认值
        setType(
"
S
"
);
    }
  @Column(name
=
"
interest_rate
"
)
    
public
 
double
 getInterestRate()
    {
        
return
 interestRate;
    }
    
public
 
void
 setInterestRate(
double
 interestRate)
    {
        
this
.interestRate 
=
 interestRate;
    }    
}
    在上面的代码中使用构造方法来初始化了t_myaccounts
表的account_type
字段的值。  
    可以使用下面的代码进行测试:
System.out.println(((MyCheckingAccount)em.createQuery(
"
from MyCheckingAccount where id=12
"
)
    .getSingleResult()).getBalance());
MyCheckingAccount ca 
=
 
new
 MyCheckingAccount();
ca.setBalance(
342
);
ca.setOverdraftLimit(
120
);
em.persist(ca);
MySavingsAccount sa 
=
 
new
 MySavingsAccount();
sa.setBalance(
200
);
sa.setInterestRate(
321
);
em.persist(sa);
 本文转自 androidguy 51CTO博客,原文链接: http://blog.51cto.com/androidguy/214425
,如需转载请自行联系原作者
你可能感兴趣的文章
Laravel 5.0 - Middleware (中间件)
查看>>
文件特殊权限及facl
查看>>
我的友情链接
查看>>
Android按两次返回键退出应用
查看>>
第一章:认识Redhat Linux
查看>>
文本查看指令
查看>>
我的友情链接
查看>>
android开源项目框架大全:《IT蓝豹》
查看>>
我的友情链接
查看>>
如何做地图标注
查看>>
生产环境该如何选择lvs的工作模式,和哪一种算法
查看>>
iOS 正则表达式判断UITextField是否为全汉字,全字母,全数字,数字和字母
查看>>
NHibernate初探-SQLDialects
查看>>
ElasticSearch之动态映射和模板
查看>>
完全卸载 RAC_clusterware的方法
查看>>
深入理解指针函数
查看>>
shell编程详解(一)
查看>>
我的2012
查看>>
CHARTING图表控件介绍及下载地址
查看>>
JAVA题目一道
查看>>