Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate JPA加入继承_Java_Hibernate_Jpa - Fatal编程技术网

Java Hibernate JPA加入继承

Java Hibernate JPA加入继承,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个项目,其中一部分数据结构是用@heritance(strategy=heritancetype.JOINED)创建的。数据结构的这一部分如下所示: 设计是基于这样的思想 我使用Hibernate和JPA2接口作为我的数据层。上述结构产生了以下pojo/dao类(省略了getter和setter): 基本项目: @Entity @Table( name = "base_item" ) @Inheritance(strategy = InheritanceType.JOINED) publ

我有一个项目,其中一部分数据结构是用@heritance(strategy=heritancetype.JOINED)创建的。数据结构的这一部分如下所示:

设计是基于这样的思想 我使用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;
}
正如你可能已经猜到的那样,上述方法不起作用。如果我尝试访问一个“SomeNavigationClassPojo”,该实体附带了一个相关的“SomeHardwarePojo”,则会出现以下错误:

java.lang.IllegalArgumentException:无法将SomeOtherHardwarePojo字段SomeNavigationClass.someOtherHardware设置为SomeHardwarePojo


作为参考,我的目标是,如果数据库中不存在someHardwarePojo或someOtherHardwarePojo,则应将它们设置为null,而不尝试映射到PhysicalTempoJo的相应其他子级。您可以添加属性作为简单的getter:

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

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

为什么您不能只使用
baseItem
属性并提供所有其他的“getter”,例如
getSomeHardwarePojo(){返回SomeHardwarePojo的baseItem实例?(SomeHardwarePojo)baseItem:null;}
?这是个好主意!“我马上就去试试。”托比亚斯说。它就像一个符咒。如果你想详细说明你的评论作为一个答案,并用一个小的代码示例让其他人看到,我很乐意接受它作为一个答案。我只是作为评论提问,因为我担心你想在JPA查询中使用它们——这意味着一个更复杂的解决方案。