hibernate 多个实体类对应一个表

  1. 基于 hibernate 实现这个逻辑
  2. 总结

什么情况下需要多个实体类对应一个表?

在项目开发中,我们会遇到这样的场景:

实现一个酒店房间管理系统,房间类型有:

  • 普通房
  • 商务房
  • 高级房
  • 总统房

按照大部分人的设计思路,应该是设计一个 Room 类,然后提供 type 字段区分,

在业务代码中实例化一个总统房并且存储到数据库,你会这样写:

new Room
room.type = 总统房
jdbc.save room

new Room
room.type = 高级房
jdbc.save room

这个写法没错,通过持有 room 对象 set type 来管理不同类型的房间

但是,其实可以有更好的写法

  • 编写 Room 类代表房间,里面有四种套房的共性字段
  • 编写不同的类对应不同的房间,比如 PresidentRoom(extend Room
  • 在业务代码中若是操作总统房,直接通过 PresidentRoom 可提升代码可读性

ok,你已经 get 到这个确实比你的写法要好了

基于 hibernate 实现这个逻辑

编写五个实体类,Room、 PresidentRoom…

1、Room 类的头部需要加入:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorOptions(force=true)

dtype 是 hibernate 用来区分房间类型的列名,它会被自动创建到表中,你可以自定义列名和数据类型

默认列名为 dtype,类型为字符串

2、PresidentRoom 类继承 Room ,头部需要加入:

@DiscriminatorValue(value = "president_room")  
public class PresidentRoom extend Room {}

DiscriminatorValue 的意义是设置 PresidentRoom 对象 dtype 的值

总结

使用了这套设计思路后,代码的可读性变得更强了,开发上也更加得心应手了

值得注意的是

DiscriminatorColumn 只是 hibernate 框架上用来区分房间类型的,我不建议业务系统使用这个字段做逻辑


转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:hibernate 多个实体类对应一个表

字数:459

本文作者:夏来风

发布时间:2020-11-26, 23:08:36

原始链接:http://www.demo1024.com/blog/java-hibernate-single-table/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。