当前位置: 首页 > 知识库问答 >
问题:

Hibernate JPA加入了继承

韦业
2023-03-14

我有一个项目,其中一部分数据结构是用@ Inheritance(strategy = Inheritance type)制作的。已加入)。数据结构的这一部分看起来像这样:

该设计基于本文的思想。我使用Hibernate和JPA2接口作为我的数据层。上面的结构产生了下面的pojo/dao类(省略了getter和setter):

基本项:

@Entity
@Table( name = "base_item" )
@Inheritance(strategy = InheritanceType.JOINED)
public class BaseItemPojo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
}

物理项目:

@Entity
@Table( name = "physical_item" )
public class PhysicalItemPojo extends BaseItemPojo{
}

一些硬件:

@Entity
@Table( name = "some_hardware" )
public class SomeHardwarePojo extends PhysicalItemPojo{
}

其他硬件:

@Entity
@Table( name = "some_other_hardware" )
public class SomeOtherHardwarePojo extends PhysicalItemPojo{
}

这是我的问题:

我的另一个表引用了base_item类,如果该类根据该base_item_id加载“some_hardware”或“some_other_hardware”,这将使我的生活变得轻松得多。因此,我在那个特定的类上创建了这样的导航属性:

@Entity
@Table( name = "some_navigation_class" )
public class SomeNavigationClassPojo{
    @ManyToOne(optional = false)
    @JoinColumn(name="base_item_id", insertable = false, updatable = false)
    private BaseItemPojo baseItem;

    @ManyToOne
    @JoinColumn(name="base_item_id", insertable = false, updatable = false)
    private PhysicalItemPojo physicalItem;

    @ManyToOne()
    @JoinColumn(name = "base_item_id", insertable = false, updatable = false)
    private SomeHardwarePojo someHardwarePojo;

    @ManyToOne()
    @JoinColumn(name = "base_item_id", insertable = false, updatable = false)
    private SomeOtherHardwarePojo someOtherHardwarePojo;
}

正如您可能已经猜到的那样,上述方法不起作用。如果我尝试访问附加到实体的相关“SomeHardwarePojo”的“SomeNavigationClassPojo”,则会收到以下错误:

java.lang.IllegalArgumentException:无法设置SomeOtherHardwarePojo字段SomeNavigationClass。someOtherHardware到SomeHardwarePojo。

作为参考,我的目标是,如果数据库中不存在someHardwarePojo或someOtherHardwarePojo,则应将它们设置为null,而不是尝试映射到PhysicalItemPojo的相应其他子项。

共有1个答案

陈铭晨
2023-03-14

可以将属性添加为简单的getter:

public class SomeNavigationClassPojo {
    ...
    public SomeHardwarePojo getSomeHardwarePojo() { 
        return baseItem instanceof SomeHardwarePojo ? (SomeHardwarePojo) baseItem : null; 
    }
    ...
}

主要缺点:您不能在 JPA 查询中使用属性 - 例如,像 SELECT n FROM SomeNavigationClassPojo n JOIN n.somehardwarepojo s WHERE s.propertyOfHardwarePojo = 'x' 是不可能的。

 类似资料:
  • 对不起,我的英语不是我的母语,而且已经两点钟了,所以现在不能思考了。现在,在将hibernate与Java和PostgreSQL一起使用时,我遇到了下一个问题:我有如下实体Human和User(带有注释映射): 和数据库结构如下: 当我尝试运行我的项目(简单单元测试)时,我得到下一个错误: (我剪掉了日志的尾部,而它在JUnit方法中响应invokin)。 生成的查询(失败): 可以看到,它试图在

  • 问题内容: 我正在使用Hibernate JPA。我下面有Oracle存储过程。 如何调用此存储过程? 问题答案: 检查这个SO问题: 首先,您定义名为本地查询的存储过程: 然后使用以下命令执行它:

  • 问题内容: 我正在练习 自我连接 ,这是我编写查询时不了解的事情。 我有桌子 雇员表包含三个记录。 最后一列manager_id是指使Ahmed和Tove成为Ola经理的第一列ID。 如果我这样写查询 结果使艾哈迈德和托夫经理。然而 正确无误,有人可以解释吗? 问题答案: 自联接就像内部联接,其中同一表的两个或更多实例通过公共数据类型的列/字段联接在一起。这种连接(内部连接)根据连接条件给出公共行

  • 我在联合mod-RDB AOF中工作<我正在寻找一种从RDB文件重新启动后加载的方法-主要用于快速重启<除此之外,我想继续编写AOF<一旦我知道发生了灾难,我会手动从AOF加载<这是我当前的配置:(我知道appendonly yes是说AOF将在重启后加载,我正在从RDB中寻找等待加载并继续写入AOF。) 谢谢

  • 问题内容: 我正在用Java 构建一个类。逻辑本身可以工作并找到期望的解决方案(带有任意数量的参数)。无论如何,部分项目如我所料。 问题来自解决方案表示的问题。可以公平地说,我已经用Python完成了这个项目,并决定尝试使用Java作为一种介绍,这可能是问题所在,我也想像Python一样这样做。 这是我的一些课程: 问题是它仍然从Operation类获取令牌:“ null” 我知道这可能是因为op

  • 你可以给你的任务加入一段描述性的文字. 它将会在任务执行的时候显示出来. 例子 15.18. 给任务加入描述 build.gradle task copy(type: Copy) { description 'Copies the resource directory to the target directory.' from 'resources' into 'target'