在为包含接口的类层次结构找到正确的JPA映射时遇到问题

时间:2018-11-28 11:39:59

标签: java hibernate jpa interface

我给了一个复杂的类层次结构,我必须为其找到一个JPA映射。我将核心问题简化为最简单的情况:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public abstract class A extends TimestampedEntity<Long> {

    /* How to map this interface? */
    @OneToMany(mappedBy = "a") // this does not work in JPA
    private List<Special> specials;
    ...
}

@Entity
public class B extends A {}

@Entity
public class C extends A {}

Interface Special {
    void setA(A a);
    A getA();
}

@Entity
public class SpecialB extends B implements Special {
    @ManyToOne
    private A a;
    // getter, setter, ...
}

@Entity
public class SpecialC extends C implements Special {
    @ManyToOne
    private A a;
    // getter, setter, ...
}

根据许多解决JPA无法映射接口问题的文章,常见的解决方案是在接口和实现类之间挤压一个抽象类,并映射该抽象类而不是接口。这显然是不可能的,因为继承层次结构更深,实现Special的类已经在继承。

解决此问题的常用方法是什么?我能想到的唯一方法是,在需要instanceof的实例的地方,摆脱接口并使用Special使代码混乱,这是不希望的。可以在JPA映射方面具有更多经验的人指出更好的解决方案吗?

(Java EE 8,Wildfly 12,JPA 2.2,Persistence Provider Hibernate 5.1.10)

0 个答案:

没有答案