找回密码
 FreeOZ用户注册
查看: 1303|回复: 3
打印 上一主题 下一主题

JPA与继承的有趣问题

[复制链接]
跳转到指定楼层
1#
发表于 25-7-2009 20:01:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
JPA支持POJO,而POJO可以继承,这个东西很有趣。

1. 一个简单的实体
  1. package persistence2;

  2. import javax.ejb.*;
  3. import javax.persistence.*;

  4. @Entity
  5. public class MySimpleEntity {
  6.     private Long id;
  7.     private String field01;
  8.     private Double field02;

  9.     @Id
  10.     @GeneratedValue(strategy=GenerationType.AUTO)
  11.     public Long getId() {
  12.         return id;
  13.     }

  14.     public void setId(Long id){
  15.         this.id = id;
  16.     }

  17.     public String getField01(){
  18.         return field01;
  19.     }

  20.     public void setField01(String f){
  21.         this.field01 = f;
  22.     }

  23.     public Double getField02(){
  24.         return field02;
  25.     }

  26.     public void setField02(Double f){
  27.         this.field02 = f;
  28.     }

  29. }
复制代码
下面是这个实体的存贮结果:
  1. create table MySimpleEntity (id bigint generated by default as identity (start with 1), field01 varchar(255), field02 double, primary key (id))
  2. INSERT INTO MYSIMPLEENTITY VALUES(1,'Hello world',2.13E0)
复制代码
回复  

使用道具 举报

2#
 楼主| 发表于 25-7-2009 20:06:20 | 只看该作者

继承后的变化

用一个简单的子类继承它:
  1. package persistence2;

  2. import javax.persistence.*;

  3. @Entity
  4. public class MySimpleDerived extends MySimpleEntity {
  5.     private Long derivedId;
  6.     private String field03;

  7.     /*@Id
  8.     @GeneratedValue(strategy=GenerationType.AUTO)
  9.     public Long getDerivedId() {
  10.         return derivedId;
  11.     }
  12.     */

  13.     public void setDerivedId(Long i){
  14.         this.derivedId = i;
  15.     }

  16.     public String getField03(){
  17.         return field03;
  18.     }

  19.     public void setField03(String f){
  20.         this.field03 = f;
  21.     }
  22. }
复制代码
再看分别存贮MySimpleEntity和MySimpleDerived的对象的结果是:
  1. create table MySimpleEntity (DTYPE varchar(31) not null, id bigint generated by default as identity (start with 1), field01 varchar(255), field02 double, field03 varchar(255), primary key (id))
  2. INSERT INTO MYSIMPLEENTITY VALUES('MySimpleEntity',1,'Hello world',2.13E0,NULL)
  3. INSERT INTO MYSIMPLEENTITY VALUES('MySimpleDerived',2,'Hello derived',3.42E0,'I''m derived')
复制代码
总结:
1. 父子两个类采用同一张表
2. 表中第一项为DTYPE,即Data Type,对应存放类名

这样就容易理解为什么在子类中不能再声明@Id子段:因为是同一张表,不能有两个@Id
回复  

使用道具 举报

3#
 楼主| 发表于 25-7-2009 20:10:37 | 只看该作者

如果父类是POJO呢?

这是父类,注意,这里没有声明@Entity,所以父类不是实体类
  1. package persistence2;

  2. public class MySimpleNonEntity {
  3.     private String x;
  4.     private String y;

  5.     public String getX(){
  6.         return x;
  7.     }

  8.     public void setX(String x){
  9.         this.x = x;
  10.     }

  11.     public String getY() {
  12.         return y;
  13.     }

  14.     public void setY(String y){
  15.         this.y = y;
  16.     }
  17. }
复制代码
而子类是实体类:
  1. package persistence2;

  2. import javax.persistence.*;

  3. @Entity
  4. public class MySimpleDerived2 extends MySimpleNonEntity {
  5.     private Long id;
  6.     private String z;

  7.     @Id
  8.     @GeneratedValue(strategy=GenerationType.AUTO)
  9.     public Long getId() {
  10.         return id;
  11.     }

  12.     public void setId(Long id){
  13.         this.id = id;
  14.     }

  15.     public String getZ(){
  16.         return z;
  17.     }

  18.     public void setZ(String z){
  19.         this.z = z;
  20.     }
  21. }
复制代码
存贮的结果是:
  1. create table MySimpleDerived2 (id bigint generated by default as identity (start with 1), z varchar(255), primary key (id))
  2. INSERT INTO MYSIMPLEDERIVED2 VALUES(1,'World')
复制代码
显然,父类中的属性被discard掉了,而表名和子类关联上。
回复  

使用道具 举报

4#
 楼主| 发表于 25-7-2009 21:22:46 | 只看该作者

内嵌式Embeddable/Embedded

采用内嵌式的实体是真的把另一个实体嵌进入的。所以,两个类之间不能有同名的field或property
  1. package persistence2;

  2. import javax.persistence.*;

  3. @Embeddable
  4. public class MyEmbeddableEntity {
  5.     private String a;
  6.     private String b;

  7.     public String getA() { return a; }
  8.     public void setA(String a) { this.a = a; }
  9.     public String getB() { return b; }
  10.     public void setB(String b) { this.b = b; }

  11. }
复制代码
  1. package persistence2;

  2. import javax.persistence.*;

  3. @Entity
  4. public class MyEmbeddedEntity {

  5.     private Long id;
  6.     private String ax;
  7.     private MyEmbeddableEntity e;

  8.     @Id
  9.     @GeneratedValue(strategy=GenerationType.AUTO)
  10.     public Long getId() {
  11.         return id;
  12.     }

  13.     public void setId(Long x){
  14.         this.id = x;
  15.     }

  16.     public String getAx() {
  17.         return ax;
  18.     }

  19.     public void setAx(String x){
  20.         ax = x;
  21.     }

  22.     @Embedded
  23.     public MyEmbeddableEntity getE(){
  24.         return e;
  25.     }

  26.     public void setE(MyEmbeddableEntity e){
  27.         this.e = e;
  28.     }
  29. }
复制代码
内嵌后的结果如下:
  1. create table MyEmbeddedEntity (id bigint generated by default as identity (start with 1), ax varchar(255), a varchar(255), b varchar(255), primary key (id))
  2. INSERT INTO MYEMBEDDEDENTITY VALUES(1,'MMMMMM','aaa','bbb')
复制代码
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 14-12-2024 20:47 , Processed in 0.030786 second(s), 20 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表