在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 了。
数据表图: