`
amoszhou
  • 浏览: 3372 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

JPA继承详解(annotation)

    博客分类:
  • java
阅读更多
JPA实现继承有三种类型.假设有A.B.C三个类,A为基类,B,C均为A的子类.那么三种设计方式分别为:

1.A.B.C共用一张表

2.每个类分层结构一张表A.B.C各一张表,各自包含自己的属性.

3.A.B.C各一张表.

首先,我们针对第一种情况,进行分析.

[共用一张表]

   首先我们定义基类(本例以文件为例,子类分别为文件夹和文件)
@Entity  
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)   
@Table(name="window_file")   
@DiscriminatorColumn(name="Discriminator",   
                                         discriminatorType = DiscriminatorType.STRING,   
                                         length=30)   
@DiscriminatorValue("WindowFile")   
public class WindowFile {   
       
    @Id  
    @GeneratedValue(strategy = GenerationType.AUTO)   
    private Integer id;   
    @Basic  
    @Column(name="name")   
    private String name;   
       
    @Basic  
    @Column(name="type")   
    private String type;   
       
    @Basic  
    @Column(name="date")   
    private String date;   
//getter setter......  

分别再定义两个子类
@Entity  
@DiscriminatorValue("Folder")   
public class Folder extends WindowFile {   
  
    @Basic  
    @Column(name="file_count")   
    private Integer fileCount;   
  
    public Integer getFileCount() {   
        return fileCount;   
    }   
  
    public void setFileCount(Integer fileCount) {   
        this.fileCount = fileCount;   
    }   
       
       
       
}  


@Entity  
@DiscriminatorValue("Document")   
public class Document extends WindowFile {   
  
    @Basic  
    @Column(name="size")   
    private String size;   
  
    public String getSize() {   
        return size;   
    }   
  
    public void setSize(String size) {   
        this.size = size;   
    }  


仔细观查,你会发现,除了基类上指定了@Table属性外,两个子类均没有指定,而且还有几个特殊的地方

1>父类中的@Inheritance(strategy=InheritanceType.SINGLE_TABLE):继承表标,指定实现方式为一张表,即所有的对象一张表.

2>父类中的@DiscriminatorColumn(name="Discriminator",
                                         discriminatorType = DiscriminatorType.STRING,
                                         length=30) 其实这个字段就是一个区分字段,我们平时自己设计数据库的时候,有时候也会在表中加入一个字段用于判断该记录的类型,那么这个字段就是同样功能,name为自定义的.

3>三个类都有这个注解:@DiscriminatorValue("WindowFile"),很显明,明白了第2>点,这点也很容易理解,就是上面那个字段的值,当这个字段值为"windowFile"时,他就是基类,为"Document"时,就是Document类....这个值是自定义的..

配置好项目,启动.查看数据库,发现我们的表已经被创建好.表名为"window_file" 有7个字段:Discriminator id date name type file_cout size插入一条纪录,会发现,Discriminator的值是系统自动我们插入的..

采用这种式有一个不好的地方:当页面需要进行展示的时候,我们需要对记录的类型的进行判断,因为folder的size为nll  Document类型的file_count为null,不进行判断,则会报nullPointException.而我们的Discrimination不能在页面上进行获取.所以通常做法是:多加一个字段,可以让其值保持与Discriminator的一样,或者重新创建一个Dto对象(简单的pojo),拥有这七个属性,专门用与在页面上进行显示,个人比较推荐后面的这种试,原因不多说,既然涉及到hibernate就会跟session有关,如果session关闭,采用后一种方式在页面上进行展示时也不会报NullPointException.

2.每个类分层结构一张表  这种映射方式为每个类创建一个表。在每个类对应的表中只需包含和这个类本身的属性对应的字段,子类对应的表参照父类对应的表,使用每个子类一张表 (table per subclass)策略,需要把@javax.persistence.Inheritance 注释的strategy 属性设置为InheritanceType.JOINED
代码如下:
//三个类我一起贴出来..偷下懒   
@Entity  
@Table(name="animal")   
@Inheritance(strategy = InheritanceType.JOINED )   
public class Animal {   
  
    @Id  
    @GeneratedValue(strategy = GenerationType.AUTO)   
    private Integer id;   
       
    @Column(name="name")   
    private String name;   
       
    @Column(name="color")   
    private String color;   
   //getter...setter   
}   
  
@Entity  
@Table(name="bird")   
@PrimaryKeyJoinColumn(name="BirdId")   
public class Bird extends Animal {   
       
    @Column(name="speed")   
    private String speed;   
  
    public String getSpeed() {   
        return speed;   
    }   
  
    public void setSpeed(String speed) {   
        this.speed = speed;   
    }   
       
}   
  
@Entity  
@Table(name="Dog")   
@PrimaryKeyJoinColumn(name="DogId")   
public class Dog extends Animal {   
  
    @Column(name="legs")   
    private Integer legs;   
  
    public Integer getLegs() {   
        return legs;   
    }   
  
    public void setLegs(Integer legs) {   
        this.legs = legs;   
    }   
       
       
}  

多的不说,看下数据库:生成了三张表,并分别有如下字段

animal : id color name

bird     : speed birdId(既为主键,又为外键)

dog     : legs  dogId(既为主键,又为外键)

现在写一个JSP页面,上面有name legs color输入框(即创造一条狗),当我们save成功以后,查看数据库发现animal表有值,dog有值,但bird没有,dog表中的dogId的值等于animal中的id. 这种方式也就是我们常用的外键设计方式.一般情况下推荐使用这种方式.

3.每个具体类一张表(table per concrete class)
       这种映射方式为每个类创建一个表。在每个类对应的表中包含和这个类所有属性(包括从超类继承的属性)对应的字段,使用每个具体类一张表(table per concrete class)策略,需要把@javax.persistence.Inheritance 注释的strategy 属性设置为InheritanceType.TABLE_PER_CLASS
此种方式,代码我就不贴了.. 把Animal中的inheritance改过来.去掉Dog和Bird类中的PrimaryKeyJoinColumn标注.还有一点非常重要,Animal类的主键生成策略不能自动生成了需要使用@Column(columnDefinition="integer")..进入数据库,删除animal dog brid三张表.重新编译运行项目.再进入数据库,依然是三张表,不过这三张表和以往的已经不同了..各自都包括了自己应有的属性.什么意思列?父类包含了自己的属性,而子类包括了从父类继续来的属性..

这种方式,不推荐使用,理解有三:

1>如果父类的属性特别多,那么在数据量大的时候,会产生很多见冗涂.

2>  查询所有Animal时,因为他是最继承树中的根,查询结果会得到所有继承于Animal类的记录

     delete from delete from Vehicle  a       执行该操作会删除自身对应记录,还会删除所有继承Vehicle的记录,因为他是最继承树中的根,就相当于清除整个表的数据a      

因为在公司,不能上QQ,机器也不能下载,所以没有什么截图软件,只能这样表达..希望本文对你有帮助
分享到:
评论
2 楼 amoszhou 2010-04-15  
sokoo108 写道
题目叫:JPA继承详解(annotation)
内容叫:JAP

楼主还是先改正过来吧,以免误导

谢谢提醒...以后写博的时候要注意一点...
     
1 楼 sokoo108 2010-04-15  
题目叫:JPA继承详解(annotation)
内容叫:JAP

楼主还是先改正过来吧,以免误导

相关推荐

    SpringMVC4+JPA Demo

    **SpringMVC 4 + JPA 整合详解** 在现代Java Web开发中,SpringMVC作为主流的MVC框架,常与Java Persistence API (JPA) 集成,用于处理数据持久化。本Demo将详细介绍如何在SpringMVC 4项目中整合JPA,实现高效的...

    springboot-jpa

    **SpringBoot整合JPA详解** 在现代Java开发中,Spring Boot框架因其简洁高效的特性而备受青睐,而JPA(Java Persistence API)则是Java领域中广泛使用的对象关系映射(ORM)框架之一。本文将深入探讨如何在Spring ...

    JPA注解文档

    **JPA注解详解** Java Persistence API (JPA) 是Java平台上的一个规范,用于管理关系数据库中的对象。它提供了一种面向对象的方式来操作数据库,而无需深入理解SQL。在这个文档中,我们将深入探讨JPA中的一些核心...

    JPA批注参考.JPA批注参考.

    ### JPA批注详解 #### 一、概述 Java Persistence API (JPA) 是 Java 社区标准 JSR-317 的一部分,它提供了一种面向对象的方式来处理数据库操作,极大地方便了开发人员对数据库的操作。在 JPA 中,批注...

    hibernate _annotation 注解编程

    ### Hibernate Annotation注解编程知识点详解 #### 一、概述与设置环境 - **概述**:Hibernate 是一个流行的 Java 持久层框架,它提供了一种面向对象的方式来处理数据库操作。Hibernate 支持多种元数据定义方式,...

    Hibernate Annotation应用

    《Hibernate Annotation应用详解》 在Java企业级开发中,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而Hibernate Annotation是Hibernate框架的一部分,它允许开发者使用注解来配置...

    springboot整合mongodb详解

    SpringBoot整合MongoDB详解 MongoDB是一款高性能、无模式的分布式文档型数据库,适用于处理大量数据的场景,尤其适合处理半结构化或非结构化的数据。SpringBoot是Spring框架的一个轻量级模块,旨在简化Spring应用的...

    Hibernate annotation

    《Hibernate注解详解》 在Java的持久化框架中,Hibernate以其强大的功能和灵活的配置深受开发者喜爱。尤其是在ORM(对象关系映射)领域,Hibernate通过注解方式简化了传统XML配置,使得数据库操作更加直观易懂。...

    hibernate课程详解

    ### Hibernate课程详解 #### 一、Hibernate概述及安装配置 - **HelloWorld示例**: - 创建Java项目`hibernate_0100_HelloWorld` - 配置`User-library-hibernate`,添加必要的JAR包 - 导入MySQL JDBC驱动 - 在...

    myhibernate.rar

    利用Spring Data JPA的Repository抽象,创建UserRepository接口,继承JpaRepository,自动实现基本的CRUD操作: ```java import org.springframework.data.jpa.repository.JpaRepository; public interface ...

    hibernate_validator 4 中文参考

    开发者可以通过定义字段级约束、属性级别约束、类级别约束以及约束继承来为JavaBean设置校验规则。约束可以通过注解直接声明在类的属性上,比如使用@NotNull、@Min等来定义非空校验、数值大小等限制条件。 ### 校验...

    Hibernate和spring集成

    《Hibernate与Spring集成详解》 在Java开发领域,Spring框架以其强大的依赖注入和面向切面编程能力,成为了企业级应用的首选。而Hibernate作为一款优秀的对象关系映射(ORM)工具,极大地简化了数据库操作。当这...

    spring-boot-up

    接着创建一个接口`UserRepository`,继承`JpaRepository`,这样Spring Data JPA会自动生成CRUD操作的方法: ```java import org.springframework.data.repository.CrudRepository; public interface ...

    JAVA程序员面试经常遇到的面试题和笔试题

    以下是一些核心的知识点详解: 1. **Java基础**: - 类与对象:理解面向对象编程的基本概念,如封装、继承、多态。 - 数据类型:了解基本数据类型和引用数据类型的区别,以及自动装箱拆箱机制。 - 控制流:掌握...

    《EJB3.0實例教程》.pdf

    **企业级JavaBeans(EJB)3.0详解** 企业级JavaBeans(EJB)是Java平台上用于构建可部署在企业级服务器上的组件模型。EJB 3.0是其发展的一个重要里程碑,极大地简化了开发过程,降低了对开发者的要求,使得更多的...

    EJB资料文档

    - **实体bean与JPA**:EJB3.0引入了Java Persistence API(JPA),简化了数据库操作,实体bean可以直接映射到数据库表。 - **持久化管理**:EJB3中的EntityManager和EntityTransaction提供了一种声明式和编程式的...

    testNG集成spring

    ### TestNG集成Spring知识点详解 #### 一、集成简介 Spring框架为了更好地支持单元测试,不仅为JUnit提供了相应的支持,同时也为TestNG这样的测试框架提供了集成接口类。通过Spring和TestNG的结合,开发者能够在...

    Java的质料.zip

    以下是其中包含的文件及其相关的知识点详解: 1. **jdk api 1.8_google.CHM、jdk api 1.8_google.chw**: 这两个文件是Java Development Kit (JDK) 1.8的API文档,以CHM(Microsoft HTML Help)格式提供。它们包含...

Global site tag (gtag.js) - Google Analytics