Hibernate实体对象继承的三种方法

发布时间 - 2026-01-11 01:53:07    点击率:

Hibernate实体对象继承的方法

   hibernate继承策略总共有三种,一种是共用一张表;一种是每个类一张表,表里面储存子类的信息和父类的信息;还有一种是通过表连接的方式,每个类都有一张表,但是子类对应的表只保存自己的信息,父类对应的表保存父类的信息,它们之间通过子类表和父类表的关联来获取所有的信息。

第一种方式,即共用一张表:

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="discriminator", discriminatorType=DiscriminatorType.STRING)//表示区分不同的对象的字段名 
@DiscriminatorValue("person")//用来表示该对象是何种对象的,即区分器 
public class Parent { 
  private int id; 
  private String name; 
   
  @Id 
  @GeneratedValue 
  public int getId() { 
    return id; 
  } 
  public void setId(int id) { 
    this.id = id; 
  } 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
 
} 
 
@Entity 
@DiscriminatorValue("child1") 
public class Child1 extends Parent { 
  private String email; 
 
  public String getEmail() { 
    return title; 
  } 
 
  public void setEmail(String email) { 
    this.email = email; 
  } 
 
   
} 
 
 
 
@Entity 
@DiscriminatorValue("child2") 
public class Child2 extends Parent { 
   
  private String address; 
 
  public String getAddress() { 
    return score; 
  } 
 
  public void setAddress(String address) { 
    this.address = address; 
  } 
   
}  
    

 这种情况父类和所有子类的所有信息都保存在同一张表里面,通过我们指定的@DiscriminatorColumn对应的@DiscriminatorValue来区别不同的类。 当没有指定@DiscriminatorValue的时候将使用全类名来作为DiscriminatorValue。

第二种策略是每个类一张表,保存所有信息:

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
@TableGenerator(    //一个类一张表,最重要的是要保证它们的id由一个生成器产生,@TableGenerator就是为了控制这个的 
    name="t_gen", 
    table="t_gen_table", 
    pkColumnName="t_pk", 
    valueColumnName="t_value", 
    pkColumnValue="person_pk", 
    initialValue=1, 
    allocationSize=1 
    ) 
public class Parent { 
  private int id; 
  private String name; 
   
  @Id 
  @GeneratedValue(generator="t_gen", strategy=GenerationType.TABLE)//这个就是用表生成器生成的,用同一个生成器就可以控制它们的id不重复 
  public int getId() { 
    return id; 
  } 
  public void setId(int id) { 
    this.id = id; 
  } 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
 
} 
 
 
@Entity 
public class Child2 extends Parent { 
   
  private String address; 
 
  public String getAddress() { 
    return score; 
  } 
 
  public void setAddress(String address) { 
    this.address = address; 
  } 
   
} 
 
 
@Entity 
public class Child1 extends Parent { 
  private String email; 
 
  public String getEmail() { 
    return title; 
  } 
 
  public void setEmail(String email) { 
    this.email = email; 
  } 
 
   
} 

弟三种方式是采用表连接的方式:

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
 
public class Parent { 
  private int id; 
  private String name; 
   
  @Id 
  @GeneratedValue 
  public int getId() { 
    return id; 
  } 
  public void setId(int id) { 
    this.id = id; 
  } 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
 
} 
 
@Entity 
public class Child2 extends Parent { 
   
  private String address; 
 
  public String getAddress() { 
    return score; 
  } 
 
  public void setAddress(String address) { 
    this.address = address; 
  } 
   
} 
 
 
@Entity 
public class Child1 extends Parent { 
  private String email; 
 
  public String getEmail() { 
    return title; 
  } 
 
  public void setEmail(String email) { 
    this.email = email; 
  } 
 
   
} 

         采用表连接的情况,还是每个类拥有自己的一张表,只是子类对应的表只保存子类的信息,其父类的信息由父类的表保存。当需要获取子类的完整信息时通过表连接的方式连接子类的表和父类的表获取对应信息。可以在子类的表上标注@PrimaryKeyJoinColumn(name="foreignKeyName")指明子类表相对于父类表外键的名称。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Hibernate实体对象继承的三种方法  # Hibernate  # 对象继承  # 基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(  # 基于Hibernate中配置文件的学习(分享)  # 详解 hibernate mapping配置  # Spring Boot + Jpa(Hibernate) 架构基本配置详解  # java中hibernate二级缓存详解  # Hibernate对数据库删除、查找、更新操作实例代码  # 深入理解hibernate的三种状态  # 详解hibernate自动创建表的配置  # 子类  # 自己的  # 三种  # 都有  # 希望能  # 这种情况  # 谢谢大家  # 相对于  # 最重要的是  # 第二种  # 第一种  # 总共有  # 就可以  # 其父  # 表上  # 字段名  # 在同一  # DiscriminatorType 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Passport实现OAuth2?(完整配置步骤)  Laravel Fortify是什么,和Jetstream有什么关系  Laravel如何实现一对一模型关联?(Eloquent示例)  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  如何获取免费开源的自助建站系统源码?  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  SQL查询语句优化的实用方法总结  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Android自定义控件实现温度旋转按钮效果  如何快速搭建高效可靠的建站解决方案?  如何快速建站并高效导出源代码?  5种Android数据存储方式汇总  重庆市网站制作公司,重庆招聘网站哪个好?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  如何续费美橙建站之星域名及服务?  简单实现jsp分页  如何用PHP工具快速搭建高效网站?  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  三星网站视频制作教程下载,三星w23网页如何全屏?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  详解Huffman编码算法之Java实现  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel集合Collection怎么用_Laravel集合常用函数详解  文字头像制作网站推荐软件,醒图能自动配文字吗?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  香港服务器选型指南:免备案配置与高效建站方案解析  黑客如何利用漏洞与弱口令入侵网站服务器?  原生JS获取元素集合的子元素宽度实例  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  微信小程序 五星评分(包括半颗星评分)实例代码  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何在IIS中配置站点IP、端口及主机头?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  javascript基本数据类型及类型检测常用方法小结  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能