Java JPA 3级继承

Java JPA 3级继承,java,inheritance,jpa,Java,Inheritance,Jpa,首先,我整个上午都在寻找解决问题的办法。我发现了类似的问题,但没有人解决我的问题:( 我在Java类模型上有一个3级继承: A <-- B <-- C 我不知道为什么,当我有关于该表的信息时,调用查询selectc fromc检索我0的结果。如果我执行查询selectb fromb,效果很好。我使用的层次结构注释似乎有问题 有什么想法吗?提前谢谢:)联接表继承意味着当您有一个C实体时,a、B和C表中必须有一行。如果在C中有数据,但在A或B中没有匹配的对应数据,则不会返回任何C实体-

首先,我整个上午都在寻找解决问题的办法。我发现了类似的问题,但没有人解决我的问题:(

我在Java类模型上有一个3级继承:

A <-- B <-- C
我不知道为什么,当我有关于该表的信息时,调用查询
selectc fromc
检索我
0
的结果。如果我执行查询
selectb fromb
,效果很好。我使用的层次结构注释似乎有问题


有什么想法吗?提前谢谢:)

联接表继承意味着当您有一个C实体时,a、B和C表中必须有一行。如果在C中有数据,但在A或B中没有匹配的对应数据,则不会返回任何C实体-数据对JPA不可见,因为JPA首先查询A表以查看是否有类型为3的行,然后将其连接到B和C


因此,请检查java继承模型是否与数据模型匹配。您还显示了B和C对其父项的引用-这会导致同一id字段被映射两次,因为它位于实体的PrimaryKeyJoinColumn和映射的JoinColumn中。由于被引用的A(或B)是B(或C)的一部分,因此不需要对其也有对象引用-任何继承的get方法都将从A表返回数据

你需要为你的B和C使用策略,并将FK从这些带到你的A。谢谢!我终于修好了。问题是,正如你所说,我在第二继承级别和第三继承级别有不同的类型,我想在三个表中有这样的行:A.type=1,B.type=2,所以正如你所说,它首先从A读取,他可以将它与B匹配,但由于C不是类型1,所以不能从A访问它。现在我有了A.type=B.type=1。。。再次感谢你!我的意思是,我发布的代码没有错,只是更改了DB中的列值
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.INTEGER)
@XmlRootElement
public class A implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long idA;
    private Integer type;
    ...
}

@Entity
@DiscriminatorValue("2")
@PrimaryKeyJoinColumn(name="idB", referencedColumnName="idA")
@XmlRootElement
public class B extends class A implements Serializable{
    private Long idB;
    private Integer type;
    @OneToOne(cascade={CascadeType.REMOVE}, fetch=FetchType.LAZY)
    @JoinColumn(name = "idB") 
    private A a;
    ...
}

@Entity
@DiscriminatorValue("8")
@PrimaryKeyJoinColumn(name="idC", referencedColumnName="idB")
@XmlRootElement
public class C extends class B implements Serializable{
    private Long idC;
    @OneToOne(cascade={CascadeType.REMOVE}, fetch=FetchType.LAZY)
    @JoinColumn(name = "idC") 
    private B b;
    ...
}