首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Hibernate,单表继承和使用来自超类的字段作为鉴别器列

关于Hibernate,它是一个开源的对象关系映射(ORM)框架,可以将Java对象映射到关系型数据库中的表。Hibernate提供了一种简单的方式来实现持久化操作,使得开发人员可以专注于业务逻辑而不需要关注底层的数据库操作。

单表继承是Hibernate中的一种继承策略,它将所有的子类对象都映射到同一张表中,通过在表中添加一个鉴别器列来区分不同的子类对象。使用来自超类的字段作为鉴别器列是单表继承中的一种常见做法,可以避免在表中添加额外的鉴别器列,同时也可以保证数据的一致性。

在单表继承中,可以使用以下方式来定义鉴别器列:

代码语言:java
复制
@Entity
@Table(name = "employee")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "employee_type", discriminatorType = DiscriminatorType.STRING)
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "employee_type")
    private String employeeType;

    // 其他属性和方法
}

在上述代码中,使用了@DiscriminatorColumn注解来定义鉴别器列,并指定了鉴别器列的名称和类型。同时,在子类中不需要再次定义鉴别器列,Hibernate会自动使用超类中定义的鉴别器列来区分不同的子类对象。

总之,Hibernate是一个强大的ORM框架,可以帮助开发人员更加高效地实现数据持久化操作。单表继承是Hibernate中的一种继承策略,可以将子类对象映射到同一张表中,通过使用来自超类的字段作为鉴别器列来区分不同的子类对象。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Hibernate【映射】续篇

组件映射 Java主要的类主要有两种方式 组合关系,组合关系对应的就是组件映射 继承关系,继承关系对应的就是继承映射 组件映射实际上就是将组合关系的数据映射成一张表,组件类和被包含的组件类映射成一张表...表结构 我们的表应该是这样的:id和name从Animal中继承,catchMouse是子类的具体行为。 ?...鉴别器字段:作用是在数据库中区别每一个子类的信息, 就是一个列 discriminator-value="cat_" 指定鉴别器字段,即type_字段的值 如果不指定,默认为当前子类的全名 --...SQL 我们即将使用的是:每个子类映射成一张表,父类不对应表…这和我们传统方式继承是一样的。...因此.hbm.xml就给出了几个节点供我们使用,分别有以下的情况: 子类父类共有一张表subclass 不符合数据库设计规范 需要使用鉴别器 子类、父类都有自己的表joined-subclass,那么就是三张表

77160

初识Hibernate之继承映射

例如: 如图,student表和teacher表共同具有id,name,age等字段,而我们的继承映射就是这样的一个思想,抽象出这些共有的字段为一张父表,让子表对其进行继承,这样就可以大大降低我们实体类代码的冗余性...--指定鉴别器列的名称和类型--> 表的表名,鉴别器就是用来区分当前记录时student或是teacher的一个标记,它会在新表中生成一个字段,而该字段的名称和类型都在此处进行指定。...下面我们通过插入数据来看看具体生成的表的结构: 很明显,我们的person表只起到一个模板的效果并没有什么实际的价值,而我们students表和teachers表的id,name字段都是从person表中继承得到的...joined-subclass来配置继承子类,在Hibernate生成数据表的时候会将student和teacher表的主键作为外键关联父表的主键。

82080
  • SqlAlchemy 2.0 中文文档(九)

    尽管多态鉴别器表达式不是严格必需的,但如果需要多态加载,则需要它。在基础表上建立列是实现这一点的最简单方法,然而非常复杂的继承映射可能会使用 SQL 表达式,例如 CASE 表达式,作为多态鉴别器。...强烈建议如果需要关系加载和多态加载的灵活性,尽量使用连接或单表继承。如果不需要多态加载,则每个类完全引用自己的表时可以使用普通的非继承映射。...虽然多态鉴别器表达式不是严格必需的,但如果需要多态加载,则需要。在基表上建立一个列是实现此目的的最简单方法,但是非常复杂的继承映射可能会使用 SQL 表达式,例如 CASE 表达式,作为多态鉴别器。...无论继承映射使用不同的联接表作为子类(如联合表继承)还是所有一个表作为单表继承,这个值都应该被持久化并在查询时对 ORM 可用。...强烈建议如果需要灵活性的关系加载和多态加载,尽可能使用连接或单表继承。如果不需要多态加载,则可以使用普通的非继承映射,如果每个类都完全引用其自己的表格。

    26710

    加速你的Hibernate引擎(上) 转

    主要的缺点整个类层次中的所有属性都挤在一张大表里,如果有很多子类特有的属性,数据库中就会有太多字段的取值为null,这为当前基于行的数据库(使用基于列的DBMS的数据仓库处理这个会更好些)的SQL调优增加了难度...; 优点包括数据表比较紧凑(没有不需要的可空字段),数据跨三个子类的表进行分区,容易使用超类的表与其他表进行关联。...缺点是在所有策略中它使用的表和表连接最多,SQL语句稍显复杂(看看Hibernate动态鉴别器的长CASE子句)。相比单张表,数据库要花更多时间调优数据表连接,数据仓库在使用该策略时通常不太理想。...因为不能跨超类和子类的字段来建立复合索引,如果需要按这些列进行查询,性能会受影响。任何子类数据的修改都涉及两张表:超类的表和子类的表。...“每个具体类一张表”对有高并发、复杂查询并且没有共享列的OLTP系统来说是个不错的选择。当然你不得不牺牲超类与其他类之间的关联。

    62330

    Hibernate映射继承关系

    在Hibernate中,继承关系的映射可以使用三种方式,分别是单表继承、多表继承和一对一继承。...Hibernate中的实体类是指对应于数据库中一张表的Java类,继承关系的映射将子类和父类的属性映射到同一张表中或者分别映射到不同的表中。...在Hibernate中,继承关系的映射方式主要有三种,分别是单表继承、多表继承和一对一继承。单表继承在单表继承中,继承关系的子类和父类使用同一个表。...二、单表继承映射示例在本文中,我们将从单表继承开始,展示如何使用Hibernate实现继承关系的映射。下面是两个Java类,我们将使用这两个类来演示单表继承的映射。...在类中定义了一个主键的id字段和一个name字段,因为我们使用的是单表继承,这些字段在数据库中都会共用同一张表。

    53930

    Hibernate Spring Java Persistence API EJB3 相关的术语及关键字

    Reference 3.2翻译时采用的术语 O/R Mapping 对象/关系数据库映射 identifier property: 标识属性 discriminator: 辨别标志(不使用"鉴别器...不翻译 catalog 目录 tables 表 column 列/字段 index 索引 sequence 序列 对应于数据库中的sequence unique 唯一的 nullable 可为空的...property 属性 attribute 属性 Inheritance 继承 unqualified class name 短类名 不附带包名 full qualified class name...logical mapping 逻辑映射 physical mapping 物理映射 identity 标识(符) 能唯一标识一个对象的字段/列,对应到数据库一般为主键 Identifier 标识符...per Class 每个类一张表 Single Table per Class Hierarchy 每个类层次结构一张表 Joined Subclass 连接的子类 inheritance hierarchy

    90930

    hibernate笔记(三)

    -- id 节点指定的是主键映射, 即user_id是主键 主键生成方式: foreign 即把别的表的主键作为当前表的主键; property (关键字不能修改)指定引用的对象 对象的全名...注意:组件类和被包含的组件类,共同映射到一张表!...继承映射 需求:猫、猴子、动物。 所有子类映射到一张表 (1张表) 什么情况用? 子类教多,且子类较为简单,即只有个别属性! 好处:因为使用一个映射文件, 减少了映射文件的个数。...-- 继承映射, 每个类对应一张表(父类也对应表) --> hibernate-mapping package="cn.itcast.e_extends3"> <class name="Animal...总结: 所有的子类都写到一个映射文件; 父类不对应表; 每个子类对应一张表 Hibernate中映射: 多对一 一对多 多对多 一对一 (多对一的特殊应用) 组件 继承

    61240

    Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8

    :每次加载 hibernate 时都会删除上一次的生成的表,然后根据你的 model 类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。...删除-创建-操作-再删除 update:最常用的属性,第一次加载 hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库),以后加载 hibernate 时根据 model...类自动更新表结构,即使表结构改变了,但表中的行仍然存在,不会删除以前的行。...没表-创建-操作 | 有表-更新没有的属性列-操作 validate:每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。...("stone"); // 查询单条 Repository.findAll(pageable); // 带排序和分页的查询列表 Repository.saveState(1, 0); // 更新单个字段

    3.8K20

    Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8

    :每次加载 hibernate 时都会删除上一次的生成的表,然后根据你的 model 类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。...[删除-创建-操作-再删除] update:最常用的属性,第一次加载 hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库),以后加载 hibernate 时根据 model...类自动更新表结构,即使表结构改变了,但表中的行仍然存在,不会删除以前的行。...[没表-创建-操作 | 有表-更新没有的属性列-操作] validate:每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。...("stone"); // 查询单条 Repository.findAll(pageable); // 带排序和分页的查询列表 Repository.saveState(1, 0); // 更新单个字段

    3.5K40

    One-Shot Image-to-Image Translation viaPart-Global Learning With aMulti-Adversarial Framework

    受这一过程的启发,在这项工作中,我们设计了一种基于零件的鉴别器程序,该程序能够使用来自目标域的有限信息来区分从翻译图像和真实图像中随机裁剪的局部零件。...为了缓解这个问题,我们开发了一种平衡的对抗性损失,以减缓向单次拍摄图像的收敛。在这里,我们设计了一种策略,通过使用超参数α来控制两个域鉴别器的收敛速度,这可以同时提高源鉴别器和目标鉴别器。...对于一对多的情况,我们只使用来自目标域的一个图像和来自源域的许多图像。对于多对多的情况,我们使用来自这两个域的许多图像。...12(b)和表VI。如果我们不使用全局鉴别剂,很容易发现翻译的图像在没有全局约束的情况下具有非常差的全局一致性。当我们只使用全局鉴别器时,生成的图像看起来与所有生成图像中相同区域中的相同伪影相似。...当使用部分鉴别器时,可以提高性能,这得益于这样一个事实,即部分鉴别者可以通过强制生成器关注更细粒度的语义细节来帮助缓解过度拟合。 此外,我们还研究了零件鉴别器的零件尺寸和超参数α的影响。

    32320

    Hibernate框架学习之注解映射实体类

    length:指定该属性映射到数据表中的列所能保存数据的最大长度,默认是255 默认情况下,我们不使用@Column修饰属性的时候,hibernate会自动以该属性的名称映射到数据表中的列。...**我们也可以使用注解@Transient修饰属性**,它指明了该属性不会被映射到数据表中某一列,而只是作为一个属性被定义在实体类中。...联合主键的映射可以通过多个@Id进行修饰即可,但要求该实体类必须继承 java.io.Serializable并尽可能的重写Object的两个方法,hashCode和equals,因为多个属性唯一确定一条记录...总的来说,一旦hibernate发现实体类中有集合类型的属性需要映射,那么就会为集合属性单独映射出一张表,该表至少有两个字段,一个字段依赖于主表的id字段值,在新表中相同该字段值的记录共同组合成为实体类中的集合属性的值...看看表的生成情况: ? 对于像set一样的无序集合,新表的主键有user_id和value列联合作为主键,可以保证唯一确定一条数据记录。

    3.2K90

    JPA 详解

    对象关系信息:应用开发者必须提供数据库表数据和Java对象之间的对应关系 JPQL: JPA的目的是抽象具体的数据库,框架仍然提供了类SQL的方式处理特殊的方法 项目实战 首先创建项目: mvn archetype...注解@Column 是用来映射Java对象和表中的列的,及时不加注解,JPA仍然会映射,除非其使用注解@Transient修饰,则不会被映射。...可以在JPA的整个项目混用注解字段或者方法,但是在一个实体和它的子类中需要确保使用的是同一种注解方式。...,可以使用@Inheritance选择不同的存储策略,对于这种一共有三种选择: SINGLE_TABLE: 这个策略就是把所有的字段映射到一张表中 JOINERD: 对每个实体创建一张表。...表示使用Phone中的person字段来关联。

    4.8K20

    SqlAlchemy 2.0 中文文档(十)

    就一个类可以在不同情境下被完全持久化到不同表中的用例而言,早期版本的 SQLAlchemy 提供了一个来自 Hibernate 的功能,称为“实体名称”功能。...另请参阅 使用 raiseload 避免延迟加载列 use_existing_column – 如果为 True,则尝试在继承的超类(通常是单一继承的超类)上定位给定列名,如果存在,则不会生成新列...如果此映射器使用单表继承从另一个映射器继承,则可以为 None。在使用声明式时,此参数由扩展自动传递,根据通过 DeclarativeBase....polymorphic_load – 在继承层次结构中的子类中指定“多态加载”行为(仅适用于连接和单表继承)。...在继承映射器的情况下,一些列可能由超类映射器管理。例如,在Join的情况下,主键由Join引用的所有表的主键列确定。

    24810

    mybatis-plus思维导图,让mybatis-plus不再难懂

    MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。...虽然说单表的增删改查操作可以通过mybatis generator工具来生成(或者自己写模板工具生成),但项目开发的过程中总免不了要新添加新字段,这些工具就帮不了我了,我得把新字段写到原来的所有增删改查的...每当这时候,我怀念Hibernate了。嘿嘿,Hibernate加字段就贼简单,单表操作也是贼方便。但我依然不喜欢用Hibernate,哈哈。...它提供了hibernate的单表CRUD操作的方便同时,又保留了mybatis的特性。...简化 CRUD 前面已经说了mp已经简化了mybatis的单表基本操作,先来看看。

    4K180

    Hibernate HQL注入攻击入门

    但是,我在网络上找不到针对Hibernate查询语言的相关资源。因此本文总结了笔者在阅读文档和不断试验过程中的一些经验技巧。...什么是Hibernate Hibernate是一种ORM框架,用来映射与tables相关的类定义(代码),并包含一些高级特性,包括缓存以及继承,通常在Java与.NET中使用(可参考NHibernate...因为有两种错误消息来源,一种来自hibernate引擎,一种来自数据库。 HQL的一大挑战是注射模式非常有限,其没有联合,没有函数来创建简单延迟,没有系统函数,没有可用的元数据表等。...也许有读者可能会问,如果没有元数据表,怎么样才能发现隐藏的列/字段呢。...访问不同的表 如前所述,HQL支持UNION查询,可以与其它表join,但只有在模型明确定义了关系后才可使用。我发现访问其它表的唯一方法是使用子查询。

    4.3K80

    “金三银四”招聘期又要到了,快来复习JAVA题!!

    在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。...①实现方式 1、通过继承Thread类实现一个线程 2、通过实现Runnable接口实现一个线程 继承扩展性不强,java总只支持单继承,如果一个类继承Thread就不能继承其他的类了。...单例(饱汉模式、饥汉模式) 1、构造方法私有化,让除了自己类中能创建外其他地方都不能创建 2、在自己的类中创建一个单实例(饱汉模式是一出来就创建创建单实例,而饥汉模式需要的时候才创建) 3、提供一个方法获取该实例对象...2.2.5 JSP和Servlet有哪些相同点和不同点? JSP是Servlet技术的扩展,所有的jsp文件都会被翻译为一个继承HttpServlet的类。...b) 分表 :当一张表的数据比较多或者一张表的某些字段的值比较多并且很少使用时,采用水平分表和垂直分表来优化 c) 读写分离:当一台服务器不能满足需求时,采用读写分离的方式进行集群。

    2.9K130

    什么是JPA?Java Persistence API简介

    像Hibernate ORM或EclipseLink这样的框架将该任务编码为库或框架,即ORM层。作为应用程序体系结构的一部分,ORM层负责管理软件对象的转换,以便与关系数据库中的表和列进行交互。...在Java中,ORM层转换Java类和对象,以便可以在关系数据库中存储和管理它们。 默认情况下,持久化对象的名称将成为表的名称,字段将成为列。设置表后,每个表行对应于应用程序中的对象。...该georgeHarrison对象可以来自任何地方(前端提交,外部服务等),并设置其ID和name字段。然后,对象上的字段用于提供SQL insert语句的值。...作为一个示例,名为Musician的类将默认映射到名为Musician的数据库表。 传统配置是节省时间的,并且在许多情况下它运行良好。也可以自定义JPA配置。...在清单6中,我们告诉JPA要使用哪个字段作为Musician主键。

    10.3K30

    day29_Hibernate学习笔记_01

    提供一个标识属性,映射数据表主键字段。 所有属性提供public访问控制符的set和get方法(JavaBean)。...6.3、区分自然主键和代理主键 主键需要具备: 不为空/不能重复/不能改变 自然主键:在业务中,某个属性符合主键的三个要求,那么该属性可以作为主键列。...代理主键:在业务中,不存符合以上3个条件的属性,那么就增加一个没有意义的列,作为主键。 6.4、基本数据与包装类型 基本数据类型和包装类型对应hibernate的映射类型相同。...-- 配置 PO类 和 表 之间的对应关系 -->     hibernate生成insert或update语句,使用配置文件所有项             type        表中列的类型。

    1.1K20
    领券