当前位置: 首页 > 面试题库 >

是否可以在不定义任何关联的情况下映射实体中的字段?

楚流觞
2023-03-14
问题内容

我在数据库中有以下架构(简化)

MainTable(
    ID primary key
    SOMEFIELD
    CODE_FK1 -- references OtherTable1 CODE (without declared foreign key)
    CODE_FK2 -- references OtherTable2 CODE (without declared foreign key)
    ... Other fields used
)

OtherTable1(
    CODE primary key
    LABEL
    ... other fields not used
)

OtherTable2(
    CODE primary key
    LABEL
    ... other fields not used
)

我在问是否有任何方法可以为主表定义实体,以便直接使用其他表中的标签,即无需为其他表定义实体。

我无法更改数据库架构,这真的很糟糕(到处都有多个标签/代码对,在多个表中定义)。而且,如果有可能,此解决方案将使我的代码保持简单,因为我真的不需要这些其他实体。

我想这会导致类似的结果:

@Entity
public class MainEntity{
    @Id
    private Integer ID;

    @Column(name="SOMEFIELD")
    private String SomeField;

    @SomeAnnotation to Join CODE_FK_1 with OtherTable1.CODE
    @SomeAnnotation like @Column(name="LABEL", table="OtherTable1")
    private String Label1;

    @SomeAnnotation to Join CODE_FK_1 with OtherTable1.CODE
    @SomeAnnotation like @Column(name="LABEL", table="OtherTable1")
    private String Label1;

}

在此先感谢您的帮助!


问题答案:

另一种可能性是使用@Formula注释从另一个表中获取值。每当您加载实体时,这将自动生成一个子选择。

我认为您需要这样的东西:

    @Entity
public class MainEntity{
    @Id
    private Integer ID;

    @Column(name="SOMEFIELD")
    private String SomeField;

    @Formula("(SELECT ot1.LABEL FROM OtherTable1 ot1 WHERE ot1.CODE = CODE_FK_1)")
    private String Label1;

}

[Hibernate docs]
[1]中对此信息很少,因此您可能需要反复试验才能使其正确使用(但您应该可以使用进行解决hibernate.show_sql=true。)

这种方法有两个缺点:

  1. 这是特定于hibernate的代码
  2. 这是纯SQL,因此可能是特定于数据库的

高温超导

[1]:http :
//docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-
hibspec-
property
hibernate文档



 类似资料:
  • 是否可以在没有实体的情况下使用JpaRepository?在这种情况下,将其替换为DTO。 如下示例所示 这种情况有替代方案吗? 注意:DTO已经映射,但我不想创建视图来将此DTO转换为实体。 我已经验证了这个主题,但没有重大进展,请使用无实体的JpaRepository交互样式 我在试这个 接口- 公共接口BffDTOInterface2{ } 我有这个错误

  • 问题内容: 有没有一种方法可以确定给定的示例实体类: 所谓“新”,是指有人调用了新的A()甚至可能设置了名称,但从未保存或保留。 通常,人们可以检查id,但是我想要一种不需要id或getId()方法的解决方案。 基本上,即使在分离模式下,此实体也已持久化到数据库中。 @Version或getVersion也不是令人满意的解决方案。 也许是独立的|| isAttached可能有效,但是我不确定如何在

  • 我正在尝试编写一个相当于以下SQL查询的Hibernate Criteria API: 这是我的实体 这是我的实体 是引用的外键。虽然没有明显的实体级关系,我也不能添加任何关系。

  • 问题内容: 我正在阅读Java 8的使用,作者说如果您有一个覆盖toString方法的类,则在执行collect(joining())时不需要将流映射到String。一个例子: 但是,这不起作用,仅此: 可行,所以这本书是错误的呢?此外,他为什么这么说(我的措词有所改变): 还要注意,如果类具有返回字符串的toString方法,则无需使用提取名称的函数在原始流上进行映射即可获得相同的结果。 当每个

  • 在Hibernate继承映射中,JPA每类表策略, 根实体不需要表来映射, 子实体做,每个子实体都有一个表。 在我的理解中,实体是:带有映射配置的java类,它应该映射到一个表, 那么,如果没有要映射的表,根实体如何作为实体存在呢? 如果它不需要一个表来映射,我们为什么不用一个@mappedSuperclass呢? 我们可以使用此根实体进行查询吗?

  • 问题内容: 据我了解,initrd是一个小图像,可以在RAM中加载。它用于引导带有所有可加载模块的完整内核。在此过程中,我们需要vmlinuz内核映像,它是bzImage的重命名版本。 是否可以在不创建initrd映像的情况下引导内核? 问题答案: initrd / initramfs是可选的,不是必需的。bzImage是纯内核映像,可以由引导加载程序直接引导。但是,可能需要执行某些任务(通常需要