`

JPA 继承2

    博客分类:
  • JPA
 
阅读更多

JPA规范定义了一种特殊的实体类,这种实体类在实体的多在继承时使用,该类可以不映射为指定的一个表,但该类仍可定义可持久化的属性,这些可以被它的子类继承。这类实体使用标记@MappedSuperclass注释标记。

例如,将ContractEmployeeEO实体定义为非映射实体的代码,如下所示:

@DiscriminatorValue("contract")

@MappedSuperclass

public class ContractEmployeeEO extends EmployeeEO {

 

         private Date createDate;

         private Date expiredDate;

        

         @Column(name="create_date")

         public Date getCreateDate() {

                   return createDate;

         }

         public void setCreateDate(Date createDate) {

                   this.createDate = createDate;

         }

        

         @Column(name="expired_date")

         public Date getExpiredDate() {

                   return expiredDate;

         }

         public void setExpiredDate(Date expiredDate) {

                   this.expiredDate = expiredDate;

         }

}

在使用被标注@MappedSuperclass的实体时需要注意以下几个问题:

l         此实体不对应数据库中的指定表,所以不能创建该类的实体,例如以下代码:

                   ContractEmployeeEO contractor = new ContractEmployeeEO();

                   contractor.setName("Micheal");

                   contractor.setCreateDate(new Date(System.currentTimeMillis()));

                   contractor.setExpiredDate(new Date(System.currentTimeMillis()));

                   entityManager.persist(contractor);

虽然能够编译通过,但运行时由于该实体是一个不能创建的实体,所以运行时会抛出异常。

l         同样,也不能使用该实体进行EQL查询,例如以下查询SQL是不正确的。

SELECT

employee

FROM

ContractEmployeeEO employee

l         在该实体类中,可以增加可持久化的属性,这些属性虽然不能在该实体中使用,但自动被继承它的子类使用。例如继承该实体的子类FTEmployeeEO实体代码如下所示:

@Entity

@DiscriminatorValue("fulltime")

public class FTEmployeeEO extends ContractEmployeeEO {

 

         // ContractEmployeeEO类中的createDate自动继承,并映射到create_date字段中

         // ContractEmployeeEO类中的expiredDate自动继承,并映射到expired _date字段中

}

l         其子类中,若要覆盖@MappedSuperclass中的定义的属性,可以配合使用@AttributeOverride标记,指明覆盖的属性。

例如,这里在表中增加两个字段“ft_create_date”,“ft_expired_date”的SQL脚本如下:

CREATE TABLE  tb_employee (

  id int(20) NOT NULL auto_increment,

  name varchar(255) ,

  vacation_days int(10),

  create_date date,

  expired_date date,

  monthly_salary double(10,2),

  hourly_salary double(10,2),

  worked_hours int(10),

  employee_type varchar(32),

  ft_create_date date,

  ft_expired_date date,

  PRIMARY KEY  (id)

);

此时,重新映射FTEmployeeEO类中的属性createDate,将createDate属性映射到“ft_create_date”字段中,而不使用ContractEmployeeEO属性createDate,映射到“create_date”字段中,代码如下所示:

@Entity

@DiscriminatorValue("fulltime")

@AttributeOverride(name="createDate", column=@Column(name="ft_create_date"))

public class FTEmployeeEO extends ContractEmployeeEO {

         //代码省略

}

若此时将“createDate”和“expiredDate”分别覆盖父类中的属性映射定义,则需要使用@AttributeOverrides属性,代码如下所示。

@Entity

@DiscriminatorValue("fulltime")

@AttributeOverrides( {

         @AttributeOverride(name = "expiredDate", column = @Column(name = "ft_expired_date")),

         @AttributeOverride(name = "createDate", column = @Column(name = "ft_create_date"))

         }

)

public class FTEmployeeEO extends ContractEmployeeEO {

         //代码省略

}

分享到:
评论

相关推荐

    使用jpa映射关联和继承

    **二、JPA继承映射** 1. **单一继承(Single Table Inheritance,STI)**:所有子类数据都存储在同一个表中,通过一个字段来区分不同的子类。使用`@Inheritance(strategy=InheritanceType.SINGLE_TABLE)`和`@...

    JPA 实现继承关系

    2. **联合表继承( Joined Table Inheritance)**: 每个子类都有自己的数据库表,而父类的共享属性则存储在一个公共的表中。子类的表通过外键关联到父类的表。父类使用`@Inheritance(strategy = InheritanceType....

    jpa例子jpajpa

    8. **多态性(Polymorphism)**: JPA支持继承和多态性,使得你可以定义一个基类,然后多个子类继承它并有自己的数据库表。 在"apache-openjpa-1.2.0-source"这个压缩包中,包含了Apache OpenJPA项目的源代码。Open...

    学习hibernate必读,JPA2新特征和JPA2映射的神秘之旅。

    "JavaOne2009-JPA2映射的神秘之旅.pdf" 和 "JavaOne2009-JPA2新特征.pdf" 这两个文档,显然涵盖了JPA2的重要概念和新特性,特别是关于映射和框架的最新发展。以下是这两个主题的主要知识点: 1. **JPA2新特性**: ...

    SpringDataJpa开发--继承JpaRepository实现简单条件查询

    本示例主要探讨如何通过继承`JpaRepository`接口来实现简单的条件查询。`JpaRepository`是Spring Data JPA提供的一种高级抽象,它允许我们以声明式的方式处理CRUD操作,以及执行基本的查询。 首先,我们需要理解`...

    Pro JPA 2版

    本书《Pro JPA 2版》是一部深入介绍JPA2的权威书籍,作者通过全面的内容和细致的讲解,帮助读者掌握JPA的核心概念以及其在企业级应用中的实践方法。 从给定的部分内容中,我们可以总结出以下知识点: 1. JPA2架构...

    jpa/hibernate继承注解

    2. **联合表继承( Joined Table Inheritance)** 在联合表继承中,每个子类都有自己的独立表,同时还有一个公共的父类表。使用`@Inheritance(strategy = InheritanceType.JOINED)`来声明此策略。子类属性被存储在...

    spring 整合 hibernate jpa2 实例

    总的来说,这个"spring 整合 hibernate jpa2 实例"展示了如何利用Spring的便利性和JPA2的强大功能来简化数据库操作。通过合理的配置和接口设计,我们可以构建出高效、易于维护的Java应用。同时,使用Maven作为构建...

    Pro JPA2 书籍 代码

    2. **多态查询**:支持对继承层次结构中的所有子类进行查询,提高了代码的可重用性和灵活性。 3. **查询注解**:提供了更多的查询注解,如`@NamedNativeQuery`和`@SqlResultSetMapping`,使得无需编写JPQL或SQL,就...

    JPA 标注 JPA标签手册

    2. **属性映射(Attribute Mapping)**: - `@Basic`:用于基本类型的字段,表明其为简单的属性。 - `@Column`:定义属性映射到数据库表的列,包括列名、长度、是否允许为空等。 - `@Temporal`:用于日期和时间...

    JPA详细文档(JPA 批注参考)

    2. **数据库模式属性批注**: - `@Table`:用于指定实体对应的数据库表名。 - `@Column`:定义实体属性与数据库列的映射。 - `@JoinColumn`:在一对一和多对一关系中,用于指定外键列的映射。 - `@JoinTable`:...

    Spring Data JPA 简化 JPA 开发

    2. CrudRepository:继承自 Repository,提供了基本的 CRUD 功能,如 save、delete、findById 等。 3. PagingAndSortingRepository:扩展自 CrudRepository,增加了分页和排序的能力。 4. JpaRepository:是 ...

    JPA视频教程_使用jpa映射关联和继承

    在这个**“JPA视频教程_使用jpa映射关联和继承”**中,我们将深入探讨如何利用JPA来处理实体之间的关联和类的继承关系。 **1. JPA 注解** JPA 注解是实现ORM的主要手段,它们可以直接在实体类上声明,用于定义...

    JPA讲解视频

    8. **继承映射(Inheritance Mapping)**:JPA支持单表继承、联合继承和表格分层等策略,使你可以设计复杂的对象模型。 9. **懒加载(Lazy Loading)**:默认情况下,JPA实现如Hibernate支持懒加载,即关联的对象只...

    jpa经典文档呀

    7. **继承映射**:JPA允许实体类继承,提供了单表继承、联合继承和多表继承等多种策略。 8. **关联映射**:JPA支持一对一、一对多、多对一和多对多的关系映射,通过@OneToOne、@OneToMany、@ManyToOne和@ManyToMany...

    Spring Data JPA 笔记

    通过继承`JpaRepository`或自定义Repository接口,可以轻松实现数据访问。例如,`findById`、`save`等方法都由Spring Data JPA自动提供。 3. **Querydsl**:Spring Data JPA可以与Querydsl结合使用,提供更强大的...

    jpa

    2. **事务管理**:JPA支持声明式事务管理,简化了事务处理。 3. **懒加载和即时加载**:通过懒加载机制,可以优化性能,仅在需要时加载关联数据。 4. **级联操作**:允许在操作一个实体时,同时影响到与其关联的其他...

    SpringBoot2.x 继承 AbstractRoutingDataSource 动态数据源切换实现 JPA读写分离

    SpringBoot2.x 继承 AbstractRoutingDataSource 动态数据源切换实现 JPA读写分离。 使用MyCat代理MySQL8数据库,添加root账户(读写)和user账户(只读)模拟读写简单分离。

    JPA大全之经典全集

    例如,使用`EntityManager`进行数据的增删改查,利用`JPQL`(Java Persistence Query Language)或`Criteria API`进行查询,以及如何处理关联关系和继承结构等。此外,还会讲解如何在Spring框架中集成JPA,使用`...

Global site tag (gtag.js) - Google Analytics