java - 我可以编写一个休眠实体吗?
问题描述
我最近继承了一个项目,其中有 2 个共享许多公共字段的表。我是休眠新手,想知道是否可以使用组合来生成表而不是继承?B 和 D 基本上是同一个类,但表名不同。
当前层次结构是
- B 扩展 A 扩展 BaseClass
- D 扩展 C 扩展 BaseClass
我目前的问题是许多其他类扩展了没有共享字段的 BaseClass,并且 2 个子类不共享一个共同的父类,因此我无法在层次结构中添加另一个级别并使用 @MappedSuperclass。
因此,我想知道我是否可以将我的公共字段分组到一个类中,并以某种方式将我的子类与这个新类组成?
为神秘的名字道歉,但一如既往;保密...
编辑 - 发现与@Embeddable 类似的东西https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/domain/embeddables.html
解决方案
您可能会使用 @Embedded 并为 B 和 D 嵌入相同的对象,可能类似于:
@Embeddable
public class CommonFieldObject {
@Column(name="COMFIELD1")
private String commonField1;
@Column(name="COMFIELD2")
private String commonField2;
...
}
@Table
public class C extends A {
@Embedded
@AttributeOverrides({
@AttributeOverride(name="commonField1", column=@Column(name="CFO_COMFIELD1")),
@AttributeOverride(name="commonField2", column=@Column(name="CFO_COMFIELD2"))
})
private CommonFieldObject commonFieldObj; //CFO_ prefix for this reference - in case we have a second field referencing a CommonFieldObject - use a different prefix..
...
}
然后,您应该在表中获取列 CFO_COMFIELD1 和 CFO_COMFIELD2,并且可以为 D 类回收 CommonFieldObject。
推荐阅读
- python - 如何在 QGIS 的右上角设置 DockWidget?
- c# - 使用 Lambda C# 使用另一个列表更新对象列表中的属性
- c++builder - std::variant:为什么没有可行的重载 '=' 错误
- python - 如何使用 python 发送 REST API(Google Vision 的 API)请求?
- sql-server - SQL 关键字“AS”的用途是什么?
- java - 私有静态函数不能使用参数,因为在while循环中使用了参数,所以如何解决这个问题?
- mongodb - 如何从所有 MongoDB 记录中仅获取几个字段
- python - django安全模板过滤器定制
- matlab - 如何在matlab中绘制一条垂直线?
- c# - 调用我的 webapi 时收到 400 错误请求