EJB3.0里实体bean的继承映射策略

在EJB3.0 里的实体bean继承体系有三种继承映射策略,分别是:

1,InheritanceType.SINGLE_TABLE, 即整个继承体系只映射为一张数据表,这个继承体系的所有类的属性都映射到将

映射到这张表的某个字段。除了所有类属性映射的字段外,为了在这一个张表中区分各个不同的子类数据,因此额外

增加了一个类似于型别码的字段用来区分不同的类,不过该字段不一定实际存在于数据表中。如果不特别指定自己的

型别码字段,EJB3.0 会自动生成一个虚拟的型别码字段(名字为"DTYPE",类型为String),同样型别码的值也可以

自己为每个类指定,也可以自动生成,自动生产时值为类名。joined类型也有 dtype 这个特性

 

2,InheritanceType.JOINED, 每个类映射为一张单独的表,但每一张表中只映射了每个类特有的属性。一个子类对象

的数据由子类映射表里的数据和给类父类映射表里的数据共同组成。

为了区别各个类这个类型也有型别码,详细情况如上面所述。

 

3,InheritanceType.TABLE_PER_CLASS, 每个类映射为一张单独的表,且每张表中不仅包含该表对应类的特有的属性,

还包含了该类可能的父类的所有属性。

 

 

下面分别给出部分示例代码:

 

1,InheritanceType.SINGLE_TABLE

 

数据表:

 

 

 

 

 

 

 

 

 

 

部分代码:

 

// 基类
@SuppressWarnings("serial")
@Entity
@Table(name="league")
// 声明继承类型
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
// 指定自定义的型别码列
@DiscriminatorColumn(name="mydtype",// 数据表中型别码列名
	discriminatorType=DiscriminatorType.STRING, // 类型
					length=20) // String和char可以指定长度
// 指定该类自定义型别码值
@DiscriminatorValue(value="League")
public class League implements Serializable {
	
	private Integer leagueId;
	private String name;
//。。。
}


// 其中一个子类
@SuppressWarnings("serial")
@Entity
@DiscriminatorValue(value="WinterLeague")
public class WinterLeague extends League implements Serializable {

	private String winterInfo;
// 。。。
}

// 插入与查询代码示例
		WinterLeague wl = new WinterLeague("wl1","1111111");
		em.persist(wl);		
		em.flush();		
		
		List<WinterLeague> wlList = em.createQuery("select w from WinterLeague w").getResultList();
		System.out.println("wl size="+wlList.size());

 

 

2,InheritanceType.JOINED

 

这次换成使用系统自动生成的型别码,注意在数据表中加入 dtype字段

注意:只有基类映射的表的主键为自增,子表映射的主键值将由基表主键自动填写

 

数据表图:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

部分代码示例:

 

// 基类
@SuppressWarnings("serial")
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@Table(name="league")
public class League implements Serializable {
	
	private Integer leagueId;
	private String name;
//。。。
}


// 一个子类
@SuppressWarnings("serial")
@Entity
@Table(name="winterleague")
@PrimaryKeyJoinColumn(name="winterid")
public class WinterLeague extends League implements Serializable {

	private String winterInfo;
//。。。
}


// 执行代码示例
WinterLeague wl = new WinterLeague("wl1","1111111");
em.persist(wl);		
em.flush();				
		
List<WinterLeague> wlList = em.createQuery("select w from WinterLeague w").getResultList();
System.out.println("wl size="+wlList.size());

 

 

 

3,InheritanceType.TABLE_PER_CLASS

 

注意:一旦使用这种策略后主键生成策略就不能使用 AUTO  和 IDENTITY 了。

 

数据表图:

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值