Java Hibernate ORM设计策略

Java Hibernate ORM设计策略,java,hibernate,orm,Java,Hibernate,Orm,我需要构建一个车辆域对象。所有车辆对象将具有大约5个属性。。。没什么大不了的。我用@Entity注释这个类,插入一个用@id注释的id。我的问题是,我需要说明另外两种类型的专用车辆。一个需要保存2个额外的字符串值,另一个需要保存字符串列表 我希望能够执行findAll()并获取所有车辆,因此我并不热衷于为其他两种类型的车辆创建完全独立的域对象,并为它们创建完全独立的表。我曾想过创建一个“AdditionalProperties”抽象类,使其成为Vehicle的一个成员,然后将其扩展到我的两个专用

我需要构建一个车辆域对象。所有车辆对象将具有大约5个属性。。。没什么大不了的。我用@Entity注释这个类,插入一个用@id注释的id。我的问题是,我需要说明另外两种类型的专用车辆。一个需要保存2个额外的字符串值,另一个需要保存字符串列表

我希望能够执行findAll()并获取所有车辆,因此我并不热衷于为其他两种类型的车辆创建完全独立的域对象,并为它们创建完全独立的表。我曾想过创建一个“AdditionalProperties”抽象类,使其成为Vehicle的一个成员,然后将其扩展到我的两个专用车辆,但我很快就迷失了正确的方法,无法对其进行注释并将其映射到数据库。但即便如此,我还是要编写大量的整体if语句来检查向量机类型和转换该类等等

我的另一个想法是在我现在拥有的单个Vehicle domain对象中包含额外的字段(即使它们对所有其他类型的车辆没有任何意义),并将值保留为空,除非它是一种特殊车辆


有人对我应该如何处理这个问题有什么想法吗?可能有一些关于类应该如何注释的示例?

为什么不简单地创建两个子类Vehicle,并包含附加属性?Hibernate很好地支持继承。您将有三个选项来持久化实体继承树:

  • 一张表中的所有内容(通常是最快和最简单的选项)
  • 表中的每个实体
  • 公共表中的公共属性,以及它们自己的表中的附加子实体属性
无论您选择何种解决方案,选择车辆都将选择满足标准的所有类型的车辆。Hibernate查询是多态的


阅读。

为什么不简单地创建两个子类Vehicle,并包含附加属性?Hibernate很好地支持继承。您将有三个选项来持久化实体继承树:

  • 一张表中的所有内容(通常是最快和最简单的选项)
  • 表中的每个实体
  • 公共表中的公共属性,以及它们自己的表中的附加子实体属性
无论您选择何种解决方案,选择车辆都将选择满足标准的所有类型的车辆。Hibernate查询是多态的


阅读。

我是否必须将车辆注释为@MappedSuperclass?这是否允许我实例化/持久化未扩展的车辆类?或者它们都被标注为@Entity?我想我会选择第一个选项,他们都在同一张桌子上……不。MappedSuperclass和Entity是独占的。MappedSuperclass用于将公共持久性字段继承到几个不相关的实体中(例如,使用具有
lastModified
字段的BaseEntity类)。在您的情况下,您有一个函数继承,必须使用实体。如果车辆类不是asbtract,则是,除了子实体实例外,还可以保留裸车辆实例。所有实体,包括车辆,都必须有实体注释。遵循文档中的示例可以很好地工作。我构建了一个工厂来返回类型Vehicle,但是基于传入的类型,它创建了相应的具体类并返回它。我使用Spring将AJAX返回给客户机,即使我有一组工具,它也会自动识别具体的实现类,并为每个工具返回额外的值。谢谢!我是否必须将车辆注释为@MappedSuperclass?这是否允许我实例化/持久化未扩展的车辆类?或者它们都被标注为@Entity?我想我会选择第一个选项,他们都在同一张桌子上……不。MappedSuperclass和Entity是独占的。MappedSuperclass用于将公共持久性字段继承到几个不相关的实体中(例如,使用具有
lastModified
字段的BaseEntity类)。在您的情况下,您有一个函数继承,必须使用实体。如果车辆类不是asbtract,则是,除了子实体实例外,还可以保留裸车辆实例。所有实体,包括车辆,都必须有实体注释。遵循文档中的示例可以很好地工作。我构建了一个工厂来返回类型Vehicle,但是基于传入的类型,它创建了相应的具体类并返回它。我使用Spring将AJAX返回给客户机,即使我有一组工具,它也会自动识别具体的实现类,并为每个工具返回额外的值。谢谢!